第26课-守护进程设计

27.1 什么是守护进程

守护进程,也就是通常说的Daemon(精灵)进程,是Linux中的一种服务进程。它的特点是:

l  不占用控制终端(后台运行),如前面我们运行的tcp_server就会占用终端。运行程序后加&号可以后台运行。(程序:./ tcp_server &)

l  独立于控制终端

l  周期性运行

例如:smbd (我们使用的smba服务器,在进程中的守护进程就是smbd)

27.2 守护进程的设计要素

1. 后台运行

守护进程需要独立于任何一个控制终端。实现方法调用是通过创建子进程来充当守护进程,而父进程退出,这样子进程就可以在后台运行。

对于一个普通的程序:

#include<stdio.h>

int main()

{

while(1)

sleep(1);

}

该程序运行的时候终端是被占用的,不能干别的事情。为了解决这个问题,我们对它做如下的更改:

#include<stdio.h>

#include<unistd.h>

int main()

{

pid_t pid;

pid = fork();

if(pid<0)

exit(1);

if(pid>0)

exit(0);

while(1)

{

sleep(1);

}

}

我们再运行这个程序,就会发现终端是不被占用的,而且进程是存在的。

注:kill 2566(序列号)可以杀死进程,进程ps aux会显示。

2. 独立于控制终端

守护进程不能占用控制终端,因此需要在后台运行。实现方法是调用setsid()函数。

#include<stdio.h>

#include<unistd.h>

int main()

{

pid_t pid;

pid = fork();

if(pid<0)

exit(1);

if(pid>0)

exit(0);

setsid();

while(1)

{

sleep(1);

}

}

通过:ps aux查看,发现该进程不占用终端。

3. 摆脱父进程的影响

(1) 修改工作目录

进程活动时,其工作目录所在的文件系统不能卸载。例如:我们是从/mnt/usb目录下启动该守护进程的,那么如果守护进程的工作目录就是/mnt/usb,我们就无法在守护进程还在运行的情况下umount /mnt/usb。所以一般需要将守护的工作目录切换到目录。

chdir(“/”);

(2)修改文件权限掩码

文件权限掩码是指屏蔽掉文件权限中的对应位。比如掩码是500,它就屏蔽了文件创建者的可读与可执行权限。由于子进程要继承父进程的文件权限掩码,这势必影响子进程中新

创建的文件的访问权限,为避免该影响,就需要重新对子进

程中的权限掩码清零。通常的使用方法为函数:umask(0)

(3)关闭打开文件

同文件权限码一样,子进程还会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且会导致文件所在的文

件系统无法卸载。因此在子进程中需要将这些文件关闭。

for(i=0;i<MAXFILE;i++)

close(i);

27.3 实例编写

守护进程的编写:不断往/tmp/daemon.log里面写入字符串

daemon.c

#include<stdio.h>

#include<unistd.h>

#include<fcntl.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<string.h>

int main()

{

pid_t pid;

int i;

int fd;

int flag = 1; //必须设置

char *buf = "i am daemon!\n";

//1.创建子进程

pid = fork();

if(pid<0)

{

printf("fork error!\n");

exit(1);  //异常退出

}

if(pid>0)

exit(0);

//2.脱离控制终端

setsid();

//3.1改变工作目录

chdir("/");

//3.2清除掩码

umask(0);

//3.3关闭打开的文件

for(i=0;i<65535;i++)

close(i);

//4. 守护进程的实际工作

while(1)

{

if((flag == 1)&&(fd = open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,

0600))<0)

{

printf("open file error!\n");

flag = 0;  //下次不用再打开了

exit(1);

}

write(fd,buf,strlen(buf));

close(fd);

sleep(1);

}

}

运行结果:当运行该程序的时候,能在命令:ps aux里面看到。而且可以查看文件/tmp/daemon.log在不断的更新。

转载于:https://www.cnblogs.com/free-1122/p/11358148.html

第三季-第26课-守护进程设计相关推荐

  1. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  2. Linux守护进程设计规范及python实现

    http://blog.csdn.net/mr_jj_lian/article/details/7252222 守护进程 守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待 ...

  3. python实现DEAMON守护进程

    1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端 ...

  4. Python守护进程daemon实现

    1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端 ...

  5. Storm的基础知识-调度,并行,守护进程等(3)

    调度Scheduler Storm现在有4种内置调度程序:DefaultScheduler,IsolationScheduler,MultitenantScheduler,ResourceAwareS ...

  6. java 守护进程 linux_Java实现Linux下服务器程序的双守护进程

    一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问题需要手动重启,万一大半夜的挂了,还是特别麻烦的. 大多数的解决方法是使用其他进程 ...

  7. 【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程

    目录 即看即用 详细说明 systemctl 的用途 用法 例子:以管理我们的程序verdaccio为例 开机启动 设置程序开机启动.关闭.启用/禁用服务以vsftpd为例 三个部分[Unit].[S ...

  8. php比特教务选排课系统的设计与实现毕业设计源码301826

    比特教务选排课系统的设计与实现 摘 要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个B/S结构的比特教务 ...

  9. php比特教务选排课系统的设计与实现 毕业设计-附源码301826

    比特教务选排课系统的设计与实现 摘要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个B/S结构的比特教务选 ...

  10. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路(1)

    上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Mana ...

最新文章

  1. warpPerspective函数
  2. 2.2.3 调度算法的评价指标
  3. 微信小程序原生 地区选择器
  4. 2021新职业教育行业发展研究报告
  5. delimiter在mysql中的作用_细细研究MySql中delimiter起到的作用_MySQL
  6. 2021-09-19SQL42,SQL44,SQL45
  7. pycharm2019安装包以及汉化文件
  8. 黑客入侵WinXP常用七个技巧
  9. EXT文件系统族-Ext2文件系统
  10. Modbus协议简单总结
  11. fpga控制vga显示彩色图片
  12. “夜拍王”荣耀10GT上线,不用三脚架也能出夜景大片!
  13. 数学在计算机方面的应用论文参考文献,数学论文参考文献
  14. 鸿蒙源码图片,全网最全的鸿蒙源码结构分析(附自制4张架构图)
  15. PTA团体天梯赛汇总
  16. 全面领先!小i机器人再获2018年度最佳智能解决方案奖
  17. comsol-超导线1
  18. python画circos图_​用Python把图做的好看点:用Matplotlib画个Circos和弦图
  19. 诺基亚S60手机使用Gravity访问Twitter的方法
  20. 计算机网络常见问题归纳

热门文章

  1. Redis-02-Redis数据类型与对不同类型数据的操作
  2. Struts2接收前端页面数据的方式
  3. Android 项目经验汇总:Fiddler的坑,证书无效
  4. 一个程序员的爱情和他的小棉袄
  5. Flutter实战之AS快键键
  6. OpenGL中 Canvas 性能分析
  7. 个人成长过程中最重要的技能是什么?
  8. python基础篇——列表与列表算法(下)
  9. sap 打印预览界面点击打印时记录打印次数_9个Excel打印神技巧!从此打印不求人!...
  10. custompage.width 不能小数吗_为什么有军人戴眼镜?他们的裸眼视力合格吗?