守护进程

守护进程也称精灵进程(Daemon),它自成一个会话,自成一个进程组,无所谓前台,无所谓后台。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。

Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程(Daemon)。

用用ps -axj命令查看系统中的进程:

  1. 参数a表示不仅列当前用户的进程,也列出所有其他用 户的进程
  2. 参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程
  3. 参数j表示列出与 作业控制相关的信息

凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。在COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里里创建,没有用户空间代码,因此没有程序文件名和命令行, 通常采用以k开头的名字,表示Kernel。init进程我们已经很熟悉了,udevd负责维护/dev目录下的 设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件,可以看出,守护进程通 常采用以d结尾的名字,表示Daemon。

                   

守护进程的创建:

创建守护进程最关键的一步是调用用setsid函数创建一个新的Session,并成为Session Leader。

                

该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进 程组的Leader也很容易,只要先fork再调用setsid就行行了。fork创建的子进程和父进程在同一个进 程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子 进程中调用setsid就不会有问题了。

成功调用用该函数的结果是:
1. 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
2.创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。
3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了

步骤:

  1. 调用umask将文件模式创建屏蔽字设置为0.
  2. 调用fork,父进程退出(exit)。原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。2)保证子进程不是一个进程组的组长进程。
  3. 调用setsid创建一一个新会话。setsid会导致:1)调用进程成为新会话的首进程。 2)调用进程成为一个进程组的组长进程 。3)调用进程没有控制终端。(再次fork一次(可选),保证daemon进程,之后不会打开tty设备)
  4. 将当前工作目录更改为根目录。
  5. 关闭不在需要的文件描述符。
  6. 其他:忽略SIGCHLD信号。

下面贴上我自己实现的my_daemon版本:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>

void my_daemon()
{
	umask(0);

	if (fork() > 0)
	{
		exit(0);
	}

	setsid();
	chdir("/");
	close(0);
	close(1);
	close(2);
	signal(SIGCHLD, SIG_IGN);
}

int main()
{
	my_daemon();
	while (1);

	return 0;
}

自己写一个my_daemon只是为了了解其底层工作的原理,真正用的时候当然是调用系统的接口了:

              

其中两个参数分别表示是否需要更改当前工作目录,是否需要关闭标准输入输出和错误。都传0表示更改且关闭。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章