`

进程关系

    博客分类:
  • 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_进程关系

    总之,第9章《进程关系》涵盖了UNIX系统中进程间交互的核心机制,包括进程的创建、终止、控制终端的管理,以及用户登录过程的详细步骤。这些知识对于理解UNIX系统的运行机制和编写与进程交互的程序至关重要。

    Tree2-2LO.rar_Process_进程关系

    "Tree2-2LO.rar_Process_进程关系"这个标题暗示了我们将会探讨的是如何查看和管理计算机中的进程,以及它们之间的相互联系。这个主题对于系统管理员、开发者和高级用户来说尤其重要,因为他们需要对系统的运行状况有...

    Android 组件复用和进程关系

    总结一下,Android组件的复用和进程关系是Android开发中的核心概念。通过合理利用组件复用,可以提高代码的可维护性和用户体验;理解进程模型有助于我们优化应用性能,尤其是在资源有限的移动设备上;而跨进程通信...

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

    在Linux环境中进行高级编程,了解进程环境、进程控制和进程关系是至关重要的。这些概念构成了操作系统的核心部分,允许程序在多任务系统中并发执行。以下是对这些主题的详细阐述: **进程状态转换图** 进程的状态...

    操作系统进程控制实验报告.doc

    父子进程关系是指父进程和子进程之间的关系。父进程可以创建子进程,子进程可以继承父进程的地址空间和资源。子进程可以执行不同的程序,需要系统调用 exec() 函数装入新的程序执行。 8. 进程生命期: 进程生命期...

    P04:UNIX V6++中新进程的创建与父子进程同步1

    实验报告要求学生理解这些系统调用的原理,并能根据程序输出分析进程关系。思考题1要求分析图1的输出,识别每个进程是父进程还是子进程,并绘制出父子进程的关系图。思考题2则要求理解图3中`exit(0)`和`exit(1)`的...

    进程同步.docx

    进程关系是指进程之间的关系,包括父子进程关系和进程组关系。 1. 父子进程关系 每个进程有一个父进程。父进程通过调用 fork 函数产生子进程。当子进程终止时,父进程会得到通知并能取得子进程退出状态。 2. 进程...

    实验二、进程管理及进程通信(一)实验报告

    例如,`wu.c`和`wu2.c`中的输出显示了不同进程ID,这有助于理解`fork()`在不同进程中的返回值以及如何形成父子进程关系。 总结来说,这个实验提供了一个实践平台,让我们能够亲自动手创建和管理进程,理解并发执行...

    进程浏览器

    **进程树**是进程浏览器展示进程关系的一种方式。在进程浏览器中,每个进程都会以树状结构呈现,根节点通常代表操作系统本身,其他节点则表示由父进程启动的子进程。这种视图使得用户能够清晰地看到进程之间的启动...

    进程的关系

    3. **兄弟进程关系**:多个由同一个父进程创建的进程彼此之间被称为兄弟进程,它们之间除了共享某些资源(如父进程的环境变量)外,其他资源通常是独立的。 4. **进程通信(IPC, Inter-Process Communication)**:...

    进程和线程之间的关系

    ### 进程和线程之间的关系 在计算机科学领域中,进程和线程是两个非常重要的概念,它们之间既有联系又有区别。对于初学者来说,理解进程与线程的关系至关重要,因为这有助于深入掌握操作系统的基本原理及应用。下面...

    linux下进程管理实验

    通过这种方式,可以观察到更复杂的父子进程关系,如孙子进程的产生,以及它们各自独立的执行轨迹。 5. **父子进程关系**: 在Linux中,父进程创建的子进程继承了父进程的大部分属性,如文件描述符、环境变量等。...

    计算机操作系统 进程撤销源代码

    在这个C语言模拟实现中,使用进程树的形式展示进程关系,有助于可视化进程的层次结构和撤销行为。实时显示模拟进程的情况可以让学习者更好地理解进程撤销的动态过程。 通过深入研究这个项目,开发者不仅可以掌握...

    操作系统课程设计(进程管理C++实现)

    4. **父子进程关系**: 在操作系统中,一个进程可以创建新的进程,新进程被称为子进程,而创建它的进程被称为父进程。你需要实现一个机制,使得父进程能够创建子进程,并且子进程能继承父进程的一些属性,如环境...

    Linux打印进程树_linux打印_

    `pstree`命令可以直接以树状形式显示进程关系,非常直观。默认情况下,它会显示所有进程,但你可以通过传递参数来指定特定的进程,如`pstree 1234`。 此外,`pgrep`和`pids`命令虽然不直接打印进程树,但在查找特定...

    linux模块方式实现打印进程树

    进程树是一种描述进程间父子关系的数据结构,根节点是系统启动的第一个进程(通常是init进程),其他进程根据它们的创建顺序和父进程关系排列。通过递归的方式,我们可以从任意一个进程出发,找出其所有子进程,...

    Linux操作系统进程管理学习教案.pptx

    - **父子进程关系**:通过指针连接父进程、子进程和兄弟进程,便于跟踪和管理进程树。 9. **核心态与核心栈**: - **两种运行模式**:核心态和用户态。内核始终在核心态运行,用户进程通过系统调用进入核心态。 ...

    linux 进程 线程 fork 的深入思考

    3. **进程关系:** - 进程之间呈现树状结构,其中 `init` 进程作为树的根节点,其他进程都具有一个父进程。 - 父进程启动的子进程,子进程则成为父进程的孩子。 4. **fork 函数工作原理:** - `fork` 函数用于...

    操作系统试验 进程间通信

    进程的亲缘关系通常是指父子进程关系。 2. 有名管道(Named Pipe):有名管道克服了管道无名的限制,允许无亲缘关系的进程间通信。它以文件形式存在于文件系统中,因此可以被多个进程共享。 3. 信号量(Semaphore...

    Linux中进程控制与管理

    #### 进程ID与父子进程关系 每个进程都有一个唯一的标识符——**进程ID**(PID),它是系统管理和识别进程的关键。当需要对特定进程进行操作,如终止进程,应通过PID而非进程名进行,这是因为进程名可能有多个实例...

Global site tag (gtag.js) - Google Analytics