1_10守护进程
守护进程:运行周期长,在后台运行,不和用户交互
会话
会话sid
会话首进程的id作为这个会话的id
会话首进程:一般是bash
会话里面有很多进程进程组,进程组的第一个进程id命名这个进程,进程消失,进程组名不变,除非整个进程消失,进程组才会消失。
即使第一个进程消失,会话id不变。
printf("pid=%d,sid=%d,gid=%d\n",getpid(),getsid(0),getpgrp());
为了防止关闭窗口进程结束,关闭之后重新开辟一个会话,将要守护的进程移到这个进程里面,这个进程不能是哪个进程的首进程,必须是一个普通的组员进程,他会成为这个会话的首进程。
守护进程的编程流程
1.fork() 退出父进程
2.setsid() 建立新会话
3.fork() 退出父进程
4.chdir("/")因为运行时间较长,将他放在根目录底下,防止被关闭。
5.umask(0) 清除掩码,可能没有一些权限但你又要用,等于说是放开权限
6.close() 关掉不用的描述符
7.处理僵死进程
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
int main
{
pid_t pid=fork();
if(pid!=0)
{
exit(0);
}
setsid();
pid=fork();
if(pid!=0)
{
exit(0);
}
chdir("/");
umask(0);
int maxfd=getdtablesize();
for(int i=0;i<maxfd;i++)
{
close(i);
}
while(1)
{
FILE * fp=fopen("/tmp/c219d.log","a");
if(fp==NULL)
{
break;
}
time_t tv;//获取本地时间
time(&tv);
fprintf(fp,"Time is %s",asctime(localtime(&tv)));//将时间转换成能看懂的
fclose(fp);
sleep(5);
}
}
想要查看文件的最后几行
tail -f c219d.log
一直在后台运行