守护进程就是进程在执行过程中不受终端影响,继续在后台执行
服务:运行周期长,不需要和用户交互
会话:在一个会话中运行的第一个进程叫做会话首进程 通常为bash,会话也有会话sid,会话sid就是会话首进程的pid
每当我们运行一个进程时,就会产生一个进程组,通过fork或者管道能在进程组中创建出多个进程,每个进程组第一个进程就是组长进程,进程组的id会以组长进程的pid来标识
当我们fork一下后就可以看到:父进程就是进程组组长,它的pid就是进程组的pid
所以我们fork一下,子进程就一定不会是组长进程或者首进程
守护进程编程流程
当一个终端关闭了,整个会话断开了,会话里的所有进程也都会被关闭,这时候我们要创建一个新会话,将进程挪到新会话中,新会话没有和任何终端关联,所以我们不关闭该会话,进程会一直存在。所以,守护进程就是把我们要它一直执行的进程从原会话中挪出啦,放到一个没有和终端关联的新会话中,此时它既是新会话的首进程,也是新会话的中的组长进程。
要注意的是,挪出来的进程不能是原来会话中的会话首进程,也不能是原来进程组的组长进程,因为,原来的会话首进程和组长进程已经分别标记过原来的会话sid和进程组pid
getsid(0); //参数0,代表获取当前会话id
setsid( ); //创建新会话
getpgrp( ); //获得当前进程组的 id
同一个终端中,会话id不会变,进程id会变,组id也会随着进程而变化
第一步:fork( ); //退出父进程,留下子进程,此时创建了两个进程组,一个父进程为组长的进程组,一个子进程为组长的进程组
第二步:setsid( ); //创建新会话,但是调用setsid时的进程不能是一个组长进程,所以要先fork一次
第三步:fork( ); //再次退出父进程,留下的是子进程的子进程,我们第一次fork等于创建了两个进程组,又一次fork等于在第二个进程组里面创建了成员进程,那么这个进程就一定是一个普通进程,可以被挪出去到我们创建的新会话中
第四步:chdir( " / " ); //将当前的工作路径挪入根目录下,以防止被清除,当我们处在一个可以被卸载的目录底下时,我们要卸载此目录会发现卸载不了
第五步:umask( 0 ); //将子网掩码去除掉
第六步:close(fd); //关闭文件描述符
第七步:如果子进程没有退出,我们要处理僵死进程
我们想要此进程结束,使用kill + 该进程pid
跟踪日志文件 tail -f 文件命称 ctrl+c退出