Linux入门:创建守护进程

       守护进程(deamon),也称精灵进程,是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出(当然可以人为的杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。

       守护进程一般以‘d’结尾,查看当前守护进程:ps ajx | grep 'd$'


创建守护进程最重要的一步是调用setsid函数创建一个新的session,并成为session leader(pid_t setsid(void)),该函数调用成功时返回新创建的session的id(也就是当前进程的id),调用这个函数的进程不允许是当前进程组的组长进程,否则出错返回-1。要保证当前进程不是组长进程只需要先fork一下再让父进程退出(exit)即可。

进程组即是一个或多个进程的集合,每个进程组都有一个唯一的进程组id等于其组长进程的id,只要进程组中有一个进程存在,该进程组就存在,与组长进程是否存在无关;而每打开一个终端就会新建一个会话,关闭一个终端则会关闭一个会话,此期间所有进程都会属于这个会话。

成功调用该函数的结果是:

1.创建一个新的session,当前进程为session leader,当前进程的id为session的id。

2.创建一个新的进程组,当前进程成为进程组的leader,当前进程的id就是进程组的id。

3.如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有终端的额守护进程。所谓失去终端是指,原来的控制终端仍然是打开的,任然可以读写,但只是一个普通的文件而不是控制终端了。

扫描二维码关注公众号,回复: 12458852 查看本文章

创建守护进程:

1.调用uamsk将文件模式创建屏蔽字设置为0;

2.调用fork,父进程退出;

3.调用setsid创建一个新会话;

4.再次调用fork,让父进程退出;

5.将当前工作目录改为根目录(因为根目录下的文件不易被删除);

6.关闭不再需要的文件描述符;

7.忽略SIGCHLD信号。


第一次调用fork是必不可少的:

(1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使shell认为该命令已执行完毕,不用

挂在输入终端上

(2)为了调用setsid函数服务,保证子进程不是一个进程组的组长进程

第二次调用fork不是必须的,是为了防止误操作再打开一个会话终端,因为打开一个会话终端的前提条件是该进        程需为会话组长,再fork一次,sid就为父进程的id,所以也就无法打开新的会话终端。


程序代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void mydaemon()
{
	umask(0);
	if(fork() > 0)
		exit(0);
	setsid();
	if(fork() > 0)
		exit(0);

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

int main()
{
	mydaemon();
	while(1)
	{
	}

	return 0;
}

运行结果:



也可以调用函数创建守护进程:


int daemon(0, 0);


猜你喜欢

转载自blog.csdn.net/if9600/article/details/72900642