1.守护进程
守护进程创建
1.fork创建子进程,父进程终止,让子进程在后台继续执行。(产生孤儿进程)
2.子进程调用setsid产生新会话期并失去控制终端调用的setsid()使子进程进程成为新会话组长和新的进程组长。
setsid 目的:由于创建守护进程第一步调用了fork ,父进程的会话期,进程组,也被子进程拷贝了。setsid函数就是为了使得它完全独立开来,从而摆脱其他进程的控制。
3.将工作路径改成根目录。这样 防止文件被删除之后,出问题
4.重设文件权限掩码
5.关闭不需要的文件描述符,使得守护进程不再持有其父进程继承来的某些文件描述符。
6退出利用kill命令
或者这么描述
1、调用umask()将文件模式创建屏蔽字设置为0; 2、调用fork,父进程退出。//1、保证守护进程不是进程组长 3、调用setsid创建一个会话。//setsid会导致:1、调用进程成为新会话的首进程,2、调用进程成为一个进程组的组长进程,3、调用进程没有控制终端。 4、将当前工作目录更改我根目录。//系统中除了跟目录都可以被删除 5、关闭不在需要的文件描述符 6、忽略SIGCHLD信号
代码实现
void mydaemon() //只fork()一次
{
umask(0); //用umask将文件模式创建为屏蔽字为0
if(fork() == 0) //fork子进程,关闭父进程
{}
else
{
exit(0);
}
setsid(); //让子进程成为一个守护进程
chdir("/"); //更改当前目录为根目录
close(0); //关闭默认的文件描述符表
close(1);
close(2);
signal(SIGCHLD, SIG_DFL); //忽略SIGCHLD信号
}
int main()
{
mydaemon();
// daemon(0, 0); //系统自己定义的守护进程,没有关闭它的默认的文件描述符表,两个参数(默认更改路径到'/', 不关闭文件描述符表)
while(1)
{}
return 0;
}
2.守护进程的作用
大部分都是服务器,就是有事情来了,它就一处理,没事就睡觉。