0
点赞
收藏
分享

微信扫一扫

创建守护进程


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

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

创建守护进程的步骤:

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为?,即该进程

为守护进程。




举报

相关推荐

0 条评论