linux下的守护进程及会话、进程组

it2022-05-07  32

  守护进程、会话、进程组网上有许多不错的资料。我也是网上搜罗了一堆,加上自己的理解。不敢说原创,只是写在这怕自己忘记罢了。才疏学浅,难免有错误,欢迎大家指正。下面这篇写很不错,大家可以去看看: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


最新回复(0)