`

进程关系

    博客分类:
  • CS
 
阅读更多

参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/03/2622029.html#2575309

 

1.终端登录

登录过程:内核--->init[进程ID=1]--->(fork)init--->(exec)getty--->(exec)--->login

登录结束过程:进程1=init->登录shell<->终端设备驱动程序<->使用终端的用户

 

 

2.网络登录

如下图

 

 

 

3.进程组

1).每个进程属于一个进程组,这个进程组从同样的终端获得信号

    函数getpgrp返回调用进程的进程组ID,结果也用pid_t表示:

#include <unistd.h>

pid_t getpgrp(void);
//返回调用进程的进程组ID。

2)SUS定义getpgid函数作为一个XSI扩展来效仿1)中函数的行为

#include <unistd.h>

pid_t getpgid(pid_t pid);
//成功返回进程组ID,错误返回-1

如果pid为0,返回调用进程的进程组ID。因而getpgid(0)等价于getpgrp();

 

3).每个进程组可以有一个进程组长。这个组长和它的进程组ID相等的进程ID于来标识(Leader的ProcessID = Process Group ID)。可能一个进程组长会创建一个进程组、创建这个组的进程,然后终止。只要至少有一个进程在这个组里,这个进程组便仍然存在,不管进程组长是否终止。一个进程加入一个存在的进程组或创建一个新的进程组,通过调用setpgid:

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);
//成功返回0,错误返回-1

setpgid函数将pid进程的进程组ID设置为pgid。如果两个参数相等,则由pid指定的进程成为进程组长。如果pid为0,那么使用调用者的进程ID。同样,如果pgid为0,由pid指定的进程ID作为进程组ID被使用。

PS:一般使进程设置其子进程的进程组ID,并且使子进程设置其中经的进程组ID

 

4.会话

会话是一个或多个进程组的集合,下面一个会话中有三个进程组

进程调用setsid函数来建立一个新的会话

#include <unistd.h>

pid_t setsid(void);
//返回进程组ID;错误返回-1

如果调用进程不是一个进程组长,那么这个函数创建一个新的会话。有三件事发生:

1).该进程变成新会话的会话首进程。(会话首进程是创建该会话的进程。)该进程是这个新会话里的唯一进程。

2).该进程变为一个新进程组的进程组长。新进程组ID就是该调用进程的进程ID。

3).该进程没有控制终端。如果进程在调用setsid之前有一个控制终端,那么这个关联被中断。

PS:如果调用者已经是一个进程组长,那么这个函数返回一个错误。为了保证不出现这种情况,通常的做法是调用fork,然后使父进程终止,而让子进程继续。

 

getsid函数返回一个进程的会话领导的进程组ID

#include <unistd.h>

pid_t getsid(pid_t pid);
//返回会话领导的进程组ID,错误返回-1

如果pid为0,getsid返回调用进程的会话领导的进程组ID。由于出于安全原因考虑,一些实现可能有如下限制:如果pid不属于调用者所在的会话,调用进程不能得到会话领导的进程组ID。

 

5.控制终端

会话和进程组有几个其它的特性::

1).会话可以有单一的控制终端。这通常是在登录到其上的终端设备(在终端登录的情况下)或者伪终端设备(在网络登录的情况下)。

2).建立与控制终端连接的会话首进程被称为控制进程。

3).一个会话里的几个进程组可以被分为一个前台进程组和一个或多个后台进程组

4).如果一个会话有一个控制终端,那么它有一个前台进程组,而在这个会话里的所有其它进程组都是后台进程组。

5).每当我们输入终端的中断键(经常是DELETE或Control-C),就会将中断信号发送给前台进程组的所有进程。

6).无论何时我们输入终端的退出键(经是Control+\),就会将退出信号发送给前台进程组的所有进程。

7).如终端接口检测到调制解调器或者网络连接断开连接,则将挂起信号发送给控制进程(会话首进程)。

 

 

6.tcgetpgrp、tcsetpgrp和tcgetsid函数

需要一种方法来告诉内核哪个进程组是前台进程组,这样终端设备驱动程序卡就能了解终端输入和终端产生的信号到何处。

复制代码
#include <unistd.h>

pid_t tcgetpgrp(int filedes);
//返回前台进程组的进程组ID;错误返回-1

int tcsetpgrp(int filedes, pid_t pgrpid);
//返回0,错误返回-1
复制代码

函数tcgetpgrp返回和在filedes上打开的终端相关联的前台进程组的进程组ID。如果进程有一个控制终端,进程可以调用tcsetpgrp来设置前台进程组ID给pgrpid。

 

SUS定义了一个XSI扩展,被称为tcgetsid,来允许一个应用程序来得到会话领导的进程组ID,给定一个控制TTY的文件描述符。

#include <termios.h>

pid_t tcgetsid(int filedes);
//返回会话领导的进程组ID。错误返回-1

需要管理控制终端的应用程序可以使用tcgetsid来标识控制终端会话首进程的会话ID(它等价于会话首进程的进程组ID)。

 

7.作业控制

作业控制要求三种形式的支持:

(1) 支持作业控制的shell。

(2) 内核中的终端驱动程序必须支持作业控制。

(3) 必须提供对某些作业控制信号的支持

 

8.shell执行程序

这里仅给出实例 详见APUE

shell命令:

ps -o pid,ppid,pgid,sid,comm | cat1 | cat2

其输出:

PID    PPID   PGID   SID   COMMAND
949    947     949    949      sh
1888  949     949    949      cat2
1889  1823   949    949      ps
1890  1988   949    949      cat1

该管道中的最后一个进程是shell的子进程,而执行管道中其他命令的进程则是该最后进程的子进程

 

9.孤儿进程组

一个父进程已终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。

分享到:
评论

相关推荐

    UNIX环境高级编程-009_进程关系

    UNIX环境高级编程一套电子书! 一共23部分19章。最后4部分为:函数原型、其它源码、习题答案、参考资料 如果您对某章节感兴趣,则下载非常方便! 如果此资源有侵权,请通知我,我会及时撤销下载!

    Android 组件复用和进程关系

    Android 组件复用和进程关系, 博客专用, 请参考http://blog.csdn.net/ostrichmyself/archive/2010/08/19/5824818.aspx

    linux环境高级编程3-unix进程环境、进程控制和进程关系.ppt

    linux环境高级编程3-unix进程环境、进程控制和进程关系.ppt

    Tree2-2LO.rar_Process_进程关系

    显示进程.可以结束和关系进程。显示进程.可以结束和关系进程。

    6种进程防杀方案和源码.rar

    为了避免父子进程关系,主进程启动临时进程,临时进程启动守护进程 优点:通用性较强,保护能力较强,可保护windows服务程序。hook防杀需要主程序和桌面交互的,而服务程序是不和桌面交互的 缺点:非真正的防杀,只是杀了又...

    进程和线程之间的关系

    详细讲解进程和线程之间的区别,方便初学者能更深透的理解

    进程查看器,可以检测到系统运行的进程,以及进程的所属关系

    进程查看器,可以检测到系统运行的进程,以及进程的所属关系。进程查看器,可以检测到系统运行的进程,以及进程的所属关系。进程查看器,可以检测到系统运行的进程,以及进程的所属关系。

    生产者-消费者问题.cpp

    生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1...

    系统进程监护(进程的父子关系)

    枚举系统进程,将进程的父子关系用CTreeCtrl控件表示出来,可以很直观地得到进程的父子关系。

    Nachos实验代码

    Nachos实验(操作系统课程设计) 共四个实验,每个实验是单独分离开,有代码,有详细文档。...程关系表实现父子进程关系。 实验4#文件系统扩展设计 使Nachos文件的长度可以扩展。 扩充Nachos文件的最大容量。

    进程线程及堆栈关系的总结

    堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。 栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,...

    论辛亥革命同中国现代化历史进程的关系·.doc

    论辛亥革命同中国现代化历史进程的关系·.doc

    意天Windows助手(进程强杀/进程守护/进程查询) v1.0.0.30简体中文绿色免费版

    进程树图: 用树的模式显示进程列表,让您可以轻松了解父进程与子进程间的关系! 进程强杀: 软件运行于内核模式时可强杀任何进程,该功能对木马进程特有效! 进程守护: 当您想长时间运行某个程序时可用此功能守护该...

    UNIX高级环境编程

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

    UNIX环境高级编程(上).rar

    09 进程关系.pdf 10 信号.pdf 11 终端IO.pdf 12 高级IO.pdf 13 精灵进程.pdf 14 进程间通信.pdf 15 高级进程间通信.pdf 16 数据库函数库.pdf 17 与PostScript 打印机通信.pdf 18 调制解调器拨号器.pdf 19...

    APUE_UNIX环境高级编程

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了众多应用...

    unix环境高级编程第2版

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

    UNIX环境高级编程 英文版+配书源码

    内容包含:UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用示例...

    UNIX环境高级编程(中文第三版)高清完整

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了众多应用...

    UNIX环境高级编程-中文第三版

    书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用...

Global site tag (gtag.js) - Google Analytics