进程编程3 - UNIX高级环境编程第9章读书笔记

本文详细介绍了UNIX系统中进程组(Process Group)、会话(Session)的概念及其管理方式,包括如何获取和设置进程组ID、会话ID等,并探讨了控制终端(Controlling Terminal)的相关特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2007年03月25日 22:03:00

9 Process Relationships

1 Process Groups

1. 每个进程属于一个Process Group,这个process Group从同样的Terminal获得Signal

2. Getpgrp可以获得process Group ID,也用pid_t结构表示:

#include >unistd.h<

pid_t getpgrp(void);

返回调用进程所属于的Process Group ID

3. getpgid可以获得某个进程的Process Group ID

#include >unistd.h<

pid_t getpgid(pid_t pid);

返回pid制定的进程所属于的Process Group ID

如果参数pid = 0,则返回调用进程所属的ProcessGroupID

4. 每个Group都有一个Leader,这个LeaderProcessID = Process Group ID

5. 一个进程调用setpgid来参加或者创建一个process Group

#include >unistd.h<

int setpgid(pid_t pid, pid_t pgid);

成功返回0,错误返回-1

注意如果pid=pgid,则指定进程成为Process Group Leader

如果pid=0,则指定进程为调用进程

2 Sessions

1. Session是一个或者多个Process Group

2. 调用setsid函数来创建一个新的session

#include >unistd.h<

int setsid(void);

成功返回0,错误返回-1

3. 调用setsid函数,如果该进程不是Process Group Leader,则函数会创建一个新的Session

a. 进程成为SessionSession Leader

b. 成为新的Process GroupLeader

c. 进程没有Controlling Terminal

4. Single UNIX Specification没有Session ID,不过我们可以认为一个SessionSession LeaderProcess ID = Session ID

5. getsid可以获得Session ID

#include >unistd.h<

pid_t getsid(pid_t pid);

成功返回Session LeaderProcess ID,错误返回-1

同样的,pid = 0标明是调用进程

3 Controlling Terminal

SessionProcess Group有下面特性:

1. Session只能有一个Controlling Terminal

2. Session LeaderControlling Terminal建立联系,称之为Controlling Process

3. Session中的Process Group可以被分为一个Foreground process group和多个Background process group

4. 按下Interrupt Key (DELETE or CTRL+C)或者Quit Key (Ctrl+/)signal会发送给Foreground Process Group中的所有Process

5. 如果network/modem disconnect被检测到,则Controlling Process会收到一个hang-up signal

6. 大部分时候Controlling Terminal就是我们Login时候的Terminal

4 tcgetpgrp, tcsetpgrp, tcgetsid

1. 下面这些函数可以被用来告诉Kernel那些Process GroupForeground,那些是Background

#include >unistd.h<

pid_t tcgetpgrp(int filedes);

成功返回Foreground Process GroupID,错误返回-1

int tcsetpgrp(int filedes, pid_t pgrpid);

成功返回0,错误返回-1

2. tcgetpgrp返回filedes对应的TerminalForeground process group ID,而tcsetpgrp可以设置foreground process group id

3. tcgetsid函数可以获得filedes所对应的Session ID,也就是Session LeaderProcess Group ID

#include >termios.h<

pid_t tcgetsid(int filedes);

成功返回Session ID,错误返回-1

作者: ATField
E-Mail:
atfield_zhang@hotmail.com
Blog:
http://blog.youkuaiyun.com/atfield



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1540823


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值