守护进程(daemon):Linux中的守护进程是一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些事件的发生。Linux中大多数服务器就是守护进程实现的。例如: internet服务器中inetd, Web服务器中的http。守护进程也完成一些系统任务如作业规划进程crond。 后台进程一般具有的性质是无输入输出,持久的运行着。
linux启动时会启动很多系统服务进程,这些进程没有控制终端,无法直接和用户交互。其他进程都是在用户登陆时启动,用户注销时退出,但系统服务进程不受用户的登录或注销改变影响,一直运行着。这种进程有一个名字叫守护进程(Daemon)。
用 ps ajx命令可以查看系统中的进程。
创建函数
创建守护进程主要分六个步骤:
1、调用umask将文件模式创建屏蔽字设置为0(即新文件权限为6 6 6);
2、调用fork函数创建一个子进程,然后让父进程退出(保证子进程不是一个进程组的组长进程);
3、调用setsid创建一个新会话(setsid调用成功则会导致:1. 保证当前进程自称进程组。 2. 保证当前进程自成会话。3. 保证当前进程与终端无关);
4、将当前工作目录更改为根目录(因为除了根目录之外其他目录基本都可以被删除);
5、关闭不再需要的文件描述符(因为后台进程不需要进行输入输出);
6、忽略SIGCHLD信号(一般进程都会忽略掉这个信号);
创建守护进程的代码编写:
创建守护进程时有人fork两次是为了保证子进程不是会话首进程,从而保证后续不会再与其他终端关联。
第一次fork:这里第一次fork的作用就是让shell认为这条命令已经终止,不用挂在终端输入上;再一个是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长(会报错Operation not permitted),如果不fork子进程,那么此时的父进程是进程组组长,无法调用setsid。所以到这里子进程便成为了一个新会话组的组长。
第二次fork:第二次fork是为了避免后期进程误操作而再次打开终端。因为打开一个控制终端的前提条件是该进程必须为会话组组长,而我们通过第二次fork,确保了第二次fork出来的子进程不会是会话组组长。