创建守护进程

守护进程,也称为精灵进程,是一种运行在后台的特殊进程,它不存在控制终端,

并周期性地执行某项任务或者等待处理某项任务。

创建守护进程的步骤:

1、让init进程成为新产生进程的父进程

  具体方法:调用fork()函数创建子进程后,使父进程立即退出。

2、调用setsid函数

调用setsid函数,使得新创建的进程脱离控制终端,同时创建新的进程组,并成为

该进程组的首进程。

3、更改当前工作目录

由于子进程继承了父进程的当前工作目录,所以需要将子进程即要创建的守护进程

的工作目录更改为守护进程需要的工作目录,一般将守护进程的工作目录设定为根目录

(/目录),更改目录用chdir函数。

4、关闭文件描述符,并重定向标准输入、输出和错误输出

守护进程运行在后台,不能往终端输出任何信息,需要用dup函数将守护进程的标准

输入、输出和错误输出重定向到/dev/null设备。

5、设置守护进程创建的文件的权限

守护进程在运行过程中可能会创建一些临时文件,而这些临时文件出于安全性方面的

考虑,一般不能被其他用户浏览,这时就需要更改文件的权限,每次更改文件权限比较麻烦

可以设置文件掩码,用umask设置好文件掩码之后就可以使得创建的文件的权限为设置的权限。


具体实例如exampl.c:

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

int daemon(int nochdir,int noclose)
{
	pid_t pid;
	pid = fork();
	if(pid < 0)
	{
	perror("fork");
	return -1;
	}
		
	if(pid != 0)
		exit(0);

	pid = setsid();

	if(pid < -1)
	{
	perror("setpid");
	return -1;
	}

	if(!nochdir)
		chdir("/");

	if(!noclose)
	{
	int fd;
	fd = open("/dev/full",O_RDWR, 0);
	if(fd != -1)
	{
	dup2(fd, STDIN_FILENO);
	dup2(fd, STDOUT_FILENO);
	dup2(fd, STDOUT_FILENO);
	if(fd > 2)
		close(fd);
	}
	}

	umask(0027);
	return 0;
	}

int main(void)
{
	daemon(0,0);
	sleep(1000);

	return 0;
}


编译程序:gcc -o example example.c

执行程序 ./example

查询程序执行结果: ps -axj | grep example

结果:

2440  4207  4207  4207 ?           -1 Ss    1000   0:00 ./example
 3421  4209  4208  3421 pts/0     4208 S+    1000   0:00 grep --color=auto example

第一行为./example进程信息, “ ? ” 表示该进程没有控制终端,TTY为?,即该进程

为守护进程。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangLanguager

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值