1 创建守护进程
1.让init进程成为新产生进程的父进程。
调用fork函数创建子进程后,使父进程立即退出。这样,产生的子进程将变成孤儿进程,并被init进程接管,同时,所产生的新进程将变为在后台运行。
2.调用setsid()
使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程。
进程组 & 会话 & 控制终端
进程组是一个或多个进程的集合,进程组ID是由领头进程的进程号决定的。
会话是一个或多个进程组的集合,与进程组类似,每个会话都存在一个领头进程。
当用户从终端登录系统,系统会创建一个新的会话。在该终端上启动的进程都会被系统划归到会话的进程组中。
会话中的进程通过该会话中的领头进程与一个终端相连。
由于守护进程不需要控制终端,因此,必须创建新的会话,以脱离父进程的影响,Linux系统提供了setsid函数用于创建新的会话,并使得调用setsid函数的进程成为新会话的领头进程。
setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。
此时进程没有控制终端,但要防止其以后打开控制终端,可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
if(pid=fork())
exit(0);
3.更改当前工作目录
使用fork函数产生的子进程将继承父进程的当前工作目录。当进程没有结束时,其工作目录是不能被卸载的。为了防止这种问题发生,守护进程一般会将其工作目录更改到