注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

读程序,学习Linux编程(十九)  

2010-08-29 21:28:04|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3.12. setsid

makedaemon的第二个函数是setsid。这段时间忙点别的事情,再加上setsid这个东西我以前也一直不明白,所以花点时间了解。

在讨论setsid之前,需要介绍点其它的东西。

3.12.1. 进程组

一个或者多个进程的集合,是进程组。进程组有组长和id,进程组id就是组长id。进程组有什么用我没搞清楚,可能是发送信号时能一次发给组里所有的成员。但我又没有找到如何枚举进程组的方法,所以很奇怪。

从终端shell中启动一个进程,这个进程就是一个进程组,进程组组长就是他自己。创建多进程的进程组的方法我知道两种。一种是用管道的方式从终端中启动几个进程,比如:

find -name "*.c" | argx grep "main()"

上面启动了一个进程组,这个进程有两个成员,组长是find。

另一种方法是由进程创建子进程,子进程的父亲就是进程组组长。当然如果子进程创建了孙子进程,组长还是父进程,不是子进程。

组长如果提前终止,组成员仍然记得进程组的id是组长,很仗义。

获得进程组id和设置进程组组长的函数如下,参数含义查man:

pid_t getpgid(pid_t pid);

int setpgid(pid_t pid, pid_t pgid);

我前面提到过,shell启动一个进程,这个进程将成为一个进程组。这个进程是shell的子进程,为什么他会成为一个单独的进程组,并且自己成为组长呢?Linux创建子进程分两步走,先将自己fork出来,然后调用exec函数系中的某一个创建子进程(exec函数系在后面说谈到)。通常在fork与exec之间,父进程会做一些手脚。shell在fork后马上调用setpgid将子进程的进程组组长设置为他自己。

3.12.2. 会话期

一个或者多个进程组的集合,是会话期。同进程组一样,我也不知道会话期有什么用。

通过shell创建的进程组,与shell共同组成一个会话期。如以下shell命令创建的两个进程组,会生成图中的会话期:

proc1 | proc2 &

proc3 | proc4 | proc5

clip_image001

3.12.3. setsid

通过上面的图形,能看到不管是前台进程组还是后台进程组,都会与shell绑定在一个会话期里。想跳出这个圈子,走下面这个套数:

1. fork子进程

2. 父进程退出,这样子进程的父进程就变成了init(参考后面的僵死进程)

3. 子进程调用setsid创建一个新的会话期

这样这个进程就脱离了shell的控制。

  评论这张
 
阅读(20)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017