您的位置:首页 > 理论基础 > 计算机网络

会话、进程组、进程个人理解。http://bbs.chinaunix.net/thread-2176051-1-1.html

2015-10-03 14:54 691 查看
会话、进程组、进程个人理解。

(1)进程必定属于一个进程组,也只能属于一个进程组。

一个进程组中可以包含多个进程。

进程组的生命周期从被创建开始,到其内所有进程终止或离开该组。

获取当前进程所在进程组ID使用函数getpgrp

创建或加入其他组使用函数setpgid

(2)假设条件:pid1进程属于pgid1进程组;pid2属于pgid2进程组,并且是pgid2进程组组长;另有进程组pgid3,

在pid1进程中调用setpgid(pid2,pgid3);

a)当pid2和pgid3都>0且不相等时

功能:将pid2进程加入到pgid3组。此时pid2进程脱离pgid2进程组,进入pgid3进程组。

b)当pid2和pgid3都>0且相等时

功能:pid2进程创建新进程组,成为新进程组长(pgid3=pid2)。

c)当pid2==0,pgid>0时

功能:将调用进程pid1加入到pgid3中。此时pid1脱离pgid1,进入pgid3。

d)当pid2>0,pgid==0时

功能:将pid2加入到调用进程所在的pgid1进程组。此时pid2脱离pgid2,进入pgid1。

e)当pid2和pgid3都==0时,返回错误。

(3)一次登录就形成一次会话,会话组长即创建会话的进程。

只有不是进程组长的进程才能创建新会话。

(4)如果pid1进程属于pgid1进程组,且不是组长,属于会话sid1。

在pid1进程中调用setsid();

功能:pid1进程脱离pgid1进程组,创建一个新的会话sid2(sid2没有控制终端),pid1进程加入到pgid2组(pgid2==pid1)。

[ 本帖最后由 wkathy 于 2008-4-2 17:00 编辑 ]
本版精华

文库|博客

(初学APUE的进来看看)《UNIX环境高级编程》单个源码编译方法

[原创] 用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址

程序员技术练级攻略

Linux下各类TCP网络服务器的实现源代码

分享:原创文档《ELF格式解析》

多线程程序中利用管道控制 select 行为

怎么理解这个 *(void **)(&cosine) ?

结构体里.是什么意思

LINUX应用程序开发指南 下载

LINUX与UNIX SHELL编程指南 下载

linux dhcp peizhi roc | 关于Unix文件的软链接 | 求教这个命令什么意思,我是新手,刚刚学习
... | sed -e "/grep/d"
是什么意思?谢谢 ... |
menb





白手起家

帖子
220
主题
16
精华
0
可用积分
187
信誉积分
100
专家积分
0
在线时间
4 小时
注册时间
2006-05-23
最后登录
2011-09-03

问答

好友

博客

消息

论坛徽章:
0

2楼[报告]


发表于
2006-06-02 15:28:15 |只看该作者

沙发
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
crspo





丰衣足食



帖子
421
主题
5
精华
1
可用积分
650
信誉积分
1034
专家积分
0
在线时间
846 小时
注册时间
2004-06-28
最后登录
2015-06-24

问答

好友

博客

消息

论坛徽章:
0

3楼[报告]


发表于
2006-06-02 20:45:41 |只看该作者

相关问题APUE相关章节讲的非常好
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
wkathy





稍有积蓄



帖子
75
主题
14
精华
0
可用积分
260
信誉积分
123
专家积分
0
在线时间
4 小时
注册时间
2006-05-14
最后登录
2013-12-05

问答

好友

博客

消息

论坛徽章:
0

4楼[报告]


发表于
2006-06-04 17:55:08 |只看该作者

我看过apue,但是那上面关于进程组的内容仅仅一页,基本内容就这些

-------------

每个进程除了有一进程I D之外,还属于一个进程组。

进程组是一个或多个进程的集合。

某个进程组中的最后一个进程可以终止,也可以参加另一个进程组(参加后还属于原来的进程组吗?)。

进程调用s e t p g i d可以参加一个现存的组或者创建一个新进程组。

int setpgid(pid_t p i d, pid_t p g i d);

将pid 进程的进程组I D设置为p g i d。

如果这两个参数相等,则由pid 指定的进程变成进程组组长。

如果p i d是0,则使用调用者的进程I D。

如果p g i d是0,则由p i d指定的进程I D被用作为进程组I D。

-------------

看了好多参考资料,晕乎乎的。
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
yanzhiyi1012





白手起家

帖子
87
主题
11
精华
0
可用积分
68
信誉积分
100
专家积分
0
在线时间
81 小时
注册时间
2009-11-05
最后登录
2010-10-17

问答

好友

博客

消息

论坛徽章:
0

5楼[报告]


发表于
2010-04-08 03:53:23 |只看该作者

总结的很好 谢谢{:2_163:}
大便的时候要留一半,免得饿得快~

帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
BMW_325i

性别:男,爱好:女。





小富即安





帖子
6857
主题
494
精华
0
可用积分
4251
信誉积分
991
专家积分
105
在线时间
2558 小时
注册时间
2010-05-03
最后登录
2014-08-06

问答

好友

博客

消息

论坛徽章:
0

6楼[报告]


发表于
2010-05-24 15:14:04 |只看该作者

准备看APUE的这一章节了!!先预习一下~!!
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
kuok2000

肚脐眼上撒盐





白手起家

帖子
86
主题
6
精华
0
可用积分
126
信誉积分
31
专家积分
0
在线时间
75 小时
注册时间
2008-05-12
最后登录
2015-09-10

问答

好友

博客

消息

论坛徽章:
0

7楼[报告]


发表于
2010-05-25 18:37:39 |只看该作者

APUE?UNIX环境高级编程?
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
BMW_325i

性别:男,爱好:女。





小富即安





帖子
6857
主题
494
精华
0
可用积分
4251
信誉积分
991
专家积分
105
在线时间
2558 小时
注册时间
2010-05-03
最后登录
2014-08-06

问答

好友

博客

消息

论坛徽章:
0

8楼[报告]


发表于
2010-05-26 13:47:26 |只看该作者

APUE?UNIX环境高级编程?

kuok2000 发表于 2010-05-25 18:37



yes,you are right
帮帮他,运维屌丝能通过试用期吗?|针对数据库事务隔离级别的讨论! | 云的时代,来谈谈你对云的认知 | python
架构你选择什么呢?
huajia136651





白手起家

帖子
1
主题
0
精华
0
可用积分
2
信誉积分
20
专家积分
0
在线时间
5 小时
注册时间
2013-01-21
最后登录
2015-07-31

问答

好友

博客

消息

论坛徽章:
0

9楼[报告]


发表于
2015-07-12 15:35:35 |只看该作者

楼主的总结应该是有问题的,我的理解如下:

BColorImageLinkQuoteCodeSmilies|添加附件

int setpgid(pid_t pid, pid_t pgid);

setpgid() sets the PGID of the process specified by pid to pgid. If pid is zero, then the

process ID of the calling process is used. If pgid is zero, then the PGID of the process

specified by pid is made the same as its process ID. If setpgid() is used to move a

process from one process group to another (as is done by some shells when creating pipe

lines), both process groups must be part of the same session (see setsid(2) and creden

tials(7)). In this case, the pgid specifies an existing process group to be joined and

the session ID of that group must match the session ID of the joining process.

按照man setpgid的解释,以及APUE的解释,如果设置参数pid为0,则会将当前进程的pid设置为参数pid值,

如果参数pgid为0,则会将pid对应的进程组设置为进程的id(也就是创建新的进程组的意思)。

后面还说到如果要改变pid的进程组,则这两个两个进程组必须在同一个会话中。

所以按照楼主的说法

在pid1进程中调用setpgid(pid2,pgid3);

a)当pid2和pgid3都>0且不相等时

功能:将pid2进程加入到pgid3组。此时pid2进程脱离pgid2进程组,进入pgid3进程组。//没有问题

b)当pid2和pgid3都>0且相等时

功能:pid2进程创建新进程组,成为新进程组长(pgid3=pid2)。//没有问题

c)当pid2==0,pgid>0时

功能:将调用进程pid1加入到pgid3中。此时pid1脱离pgid1,进入pgid3。//没有问题

d)当pid2>0,pgid==0时

功能:将pid2加入到调用进程所在的pgid1进程组。此时pid2脱离pgid2,进入pgid1。//这个应该是等价于setpgid(pid2,pid2);

e)当pid2和pgid3都==0时,返回错误。//这里不会返回错误,其实等价于setpgid(pid1,pid1);

以上大概这些都验证过,有什么不对的,请帮忙更正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: