您的位置:首页 > 运维架构 > Linux

Linux下的守护进程(daemon)(代码保留)

2015-09-21 20:32 567 查看
环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

1、一般程序的特点:依赖终端,终端退出,程序也会退出。也就是说,程序的TTY是pts/0,pts/0关闭,程序也会关闭。(ps -u negivup)

2、守护进程的特点:不依赖终端,不通过kill,无法关闭进程。

创建守护进程的步骤:

1、父进程中执行fork后,执行exit退出,使子进程成为孤儿进程(孤儿进程不依赖终端)。

2、在子进程中调用setsid(取消进程与任何终端之间的关联)。

3、让根目录“/”成为子进程的工作目录。

4、把子进程的umask变为0。

5、关闭不需要的文件描述符。

(3、4、5三项的设置是可选的,根据自己的需要设定,但是前两项是必须的)

守护进程的程序:

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

int main(int argc, char *args[])
{
// 使用fork创建进程
pid_t pid = fork();
// 判断fork是否成功
if (pid == -1)
{
printf("Message : %s\n", strerror(errno));
return -1;
}

if (pid > 0)
{
// 1、父进程退出,使子进程成为孤儿进程
exit(0);
}
else
{
// 2、取消进程和任何控制终端的关联
setsid();
// 下面的一下步骤是根据自己需要选择的,即使不选择,这个进程也是守护进程
/////////////////////////////////////
// 3、让根目录成为当前执行的目录
chdir("/");
// 4、设置进程的启动权限
// 不继承启动程序用户的权限
// 这样做的目的是保证这个进程能够被其他用户正常使用
umask(0);
// 5、关闭不需要的文件描述符
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
/////////////////////////////////////
// 这里的暂停是为了保证进程不会退出
// 否则,通过ps -u [username]看不到守护进程
pause();
}

return 0;
}

PS:根据传智播客视频学习整理得出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: