进程组和会话

进程组

进程组是指一个或多个进程的集合。通常与一个作业相关联,可以接收来自同一终端的信号。每个进程组有一个唯一的进程组ID,它类似于进程ID,是一个正整数(其实就是组长进程的进程ID)。可以通过函数获得

#include<unistd.h>

pid_t getpgrp(void);

进程组都有一个组长,组长进程的标识是其进程组ID等于进程ID。

组长可以创建一个组长进程组,创建该进程组的进程,然后终止。进程存在于组长存在没必要关系,只要进程组有一个进程存在,则进程组就存在。进程组生命周期为组长创建到最后一个进程离开为止。进程组中最后一个进程可以终止,或者转移到另一个进程组中。

可以通过下面函数加入一个进程组或创建一个进程组:

#include<unistd.h>

int setpgid(pid_t pid, pit_t pgid);

一个进程只能为它自己或自己的子进程设置进程组ID,在它的子进程调用了exec函数后,它就不能再改变该子进程的进程组ID了。

在大多数作业控制的shell中,在fork之后调用setpgid函数,使父进程设置其子进程的进程组ID,并且使子进程设置其自己的进程组ID。如果不这样做,那么fork之后,由于父、子进程运行先后次序的不确定,会造成在一段时间内(父、子进程只运行了其中一个)子进程组员身份的不确定(取决于哪个进程先执行),这就产生了竞争条件。

会话(session)

会话是一个或多个进程组的集合。shell的管道线将几个进程编成一组。

proc1 | proc2 &

proc3 | proc4 | proc5

编成的会话如下图:

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

#include<unistd.h>

pid_t setsid(void);

如果调用此函数的进程不是一个进程组的组长,则此函数会创建一个新会话,结果将发生下面3件事:

1、该进程变成新会话首进程。此时,该进程是新会话的唯一的进程。

2、该进程成为一个新进场组的组长进程。新进程组的ID是该调用进程的进程ID。

3、该进程没有控制终端。如果有,在调用后,这种联系也会被中断。

如果该进程是一个进程组的组长进程,则此函数返回出错。为了保证不会发生这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。

时间: 2024-07-31 14:20:09

进程组和会话的相关文章

Linux进程组和会话

Linux的进程相互之间有一定的关系.比如说,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构.我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程. 进程组 (process group) 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程.进程组会有一个进程组领导进程 (process group leader),领导进程的PID成为进程组的ID (process group ID, PGID),以识别进程组. $ps -o pi

linux内核之进程的基本概念(进程,进程组,会话关系)

进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树.除此以外,进程还有其他层次关系:进程.进程组和会话. 进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合. 这样说来,一个进程会有如下ID: ·PID:进程的唯一标识.对于多线程的进程而言,所有线程调用getpid函数会返回相同的值. ·PGID:进

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改

进程组与会话 Linux Process Groups and Sessions

在类Unix系统中,用户通常会跟各种相关的进程打交道.虽然在登录的时候只有一个终端进程(用户对应的登录shell ,通过这个shell启动各种程序和服务),但通常不久以后就会产生许多相关的进程,例如进行如下动作: 在后台运行无交互的程序(例如bash命令中末位的"&") 通过shell的 job control在各种交互进程之间切换 通过管道启动一组程序 在图形环境下(例如X window system)启用多个终端窗口 为了管理这些进程,内核便对这些进程进行了分组,称其为进程

从进程组、会话、终端的概念深入理解守护进程

一.写在前面 「守护进程」是 Linux 的一种长期运行的后台服务进程,也有人称它为「精灵进程」.我们常见的 httpd.named.sshd 等服务都是以守护进程 Daemon 方式运行的,通常服务名称以字母d结尾,也就是 Daemon 第一个字母.与普通进程相比它大概有如下特点: 无需控制终端(不需要与用户交互) 在后台运行 生命周期比较长,一般是随系统启动和关闭 二.守护进程必要性 为什么要设置为守护进程,普通进程不可以吗? 当我们在命令行提示符后输入类似./helloworld程序时,在

2进程之间的关系:进程组,会话,守护进程

 1进程组 一个或过个进程的集合,进程组ID是一个正整数.用来获得当前进程组ID的函数. pid_t getpgid(pid_t pid) pid_t getpgrp(void) 获得父子进程进程组 运行结果: 组长进程标识:其进程组ID=其进程ID 组长进程可以创建一个进程组,创建该进程组中的进程,然后终止,只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关. 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组) 一个进程可以为自己或子进程设置进程组ID i

作业、进程组、会话和守护进程

1. 进程组 每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或多个进程的集合.通常,它们与同一作业相关联,可以接收来自同一终端的各种信号.每个进程组有一个唯一的进程组ID.每个进程组都可以有一个组长进程.组长进程的标识是,其进程组ID等于其进程ID.组长进程可以创建一个进组,创建该组中的进程,然后终止.只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关. 2.作业 Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group

(进程关系)进程组、会话

控制终端:     当用户自举时,会创建init进程,进程号为1. init的创建使系统进入多用户状态.对于每个允许登录的设备,intit进程用一次fork,它所生成 的子进程则执行exec(getty)程序. 然后login程序将执行以下操作 : 1.将当前的工作目录设为用户的起始目录(chdir) 2.调用chown改变终端的用户所有权,使登录用户成为它的所有者. 3.将该终端设备的访问权限设为读和写. 4.调用setgid和initgroups设置进程的组ID 5.用login所得到的所有

linux 进程组 作业 会话

   进程组,作业,会话1. 进程组      每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或多个进程的集合.      通常,它们与同一作业相关联,可以接收来自同一终端的各种信号. 每个进程组有一个唯一的进程组ID.每个进程组都可以有一个组长进程.组长进程的标识是其进程组ID等于其进程ID.组长进程可以创建一个进程组,创建该组中的进程,然后终止. 只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关.2.作业     Shell分前后台来控制的不是进程