<!-- @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"
*/