守护进程、会话、进程组网上有许多不错的资料。我也是网上搜罗了一堆,加上自己的理解。不敢说原创,只是写在这怕自己忘记罢了。才疏学浅,难免有错误,欢迎大家指正。下面这篇写很不错,大家可以去看看:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html。下面的部分内容引用了他的描述。
进程组:进程组就是把一个或多个进程划为一组,给这个组分配一个组id(pgid),这个id通常是进程组组长(该组的第一个进程)的pid。如果进程组组长退出,其组的pgid不变。在这个组解散之前,系统也不会分配与此pgid相同值的pid给其他程序。进程组的设计方便对一组进程进行管理,如同时终止一组进程。还有一些系统底层上的设计,如管道。在应用上,通常用于多进程程序判断其他进程的状态。
会话:多个进程组构成一个会话。通常我们登录用户时会产生一个会话,退出时该会话结束。属于该会话的进程(比如我们开的浏览器、音乐播放)在该会话结束时都会被终止。
终端shell:在以前,计算机没有界面,所有的操作都是命令行。因此,当时的程序往往与shell相关,它需要shell来显示及输入信息。比如top程序,如果你直接退出shell,则也将终止它。但是现在界面多了,很多不依赖shell。但很多服务器程序还是在终端上运行,如果想成为守护进程,则需要脱离终端。
很多操作系统是多用户的。我们开机后,登录用户,然后开启程序,开始作业(上网,看视频等)。但是,很多程序并不是在用户登录后才开始作业,这些一般都是守护进程,如网络服务。守护进程是不依赖用户的。如果一个服务器上的程序,在用户登录后开启,用户退出后终止,这怎么可能。所以一个守护进程的特点:
守护进程编程步骤 1. 创建子进程,父进程退出 • 所有工作在子进程中进行 • 形式上脱离了控制终端(不能在shell通过ctrl+c来终止) 2. 在子进程中创建新会话 • setsid()函数 • 使子进程完全独立出来,脱离控制(用户退出终止会话时不停止服务) 3. 改变当前目录为根目录 • chdir()函数 • 防止占用可卸载的文件系统 • 也可以换成其它路径 4. 重设文件权限掩码 • umask()函数 • 防止继承的文件创建屏蔽字拒绝某些权限 • 增加守护进程灵活性 5. 关闭文件描述符 • 继承的打开文件不会用到,浪费系统资源,无法卸载 • getdtablesize() • 返回所在进程的文件描述符表的项数,即该进程打开的文 件数目其中,第一点第二点是必要的,其他的可以根据自己的程序来决定是否处理。
转载于:https://www.cnblogs.com/coding-my-life/p/4069633.html