守护进程

来源:互联网 发布:剑灵剑士女捏脸数据 编辑:程序博客网 时间:2024/04/25 04:16

<!--@page { margin: 2cm }PRE { font-family: "AR PL UKai CN" }P { margin-bottom: 0.21cm }-->

守护进程
1、setpgid一般用不着
2、一个进程只能为它自己或其子进程修改进程组
3、会话-----多个进程组的集合
4、setsid-----进程组的组长不能setsid
5、守护进程没有控制台
ps -axj
服务器应该是一个守护进程(LANQQ)
守护进程最大的特点是不占用终端

/*damon.c*//*守护进程*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int daemonize(int nochdir, int noclose)
{
pid_t pid;
int fd;

umask(0);

pid = fork();
if (pid == -1) {
perror("fork");
return -1;
}
if (pid > 0)
exit(0);
setsid();

if (nochdir == 0)
chdir("/");

if (noclose == 0) {
fd = open("/dev/null", O_RDONLY);
if (fd == -1) {
perror("open");
return -1;
}
dup2(fd, 0);
close(fd);

fd = open("/dev/null", O_WRONLY);
if (fd == -1) {
perror("open");
return -1;
}
dup2(fd, 1);
close(fd);

fd = open("/dev/null", O_WRONLY);
if (fd == -1) {
perror("open");
return -1;
}
dup2(fd, 2);
close(fd);
}
return 0;
}

int main(void)
{
int ret = daemonize(0, 1);
if (ret == -1)
exit(1);
while (1) {
sleep(1);
printf("Hello world!/n");
}
}
/*守护进程的创建:
1、umask(0);
2、fork一个子进程,然后使父进程退出(exit)
3、setsid();创建一个新会话
4、chdir("/");将当前工作目录更改为根目录
5、关闭不再需要的文件描述符,用dup2将0,1,2重定向到"/dev/null"

*/