09.进程关系

1、终端登录

BSD终端登录

a、系统管理员创建通常名为/etc/ttys的文件,其中,每个终端设备都有一行,每一行说明设备名和传递给getty程序的参数,例如,参数之一说明了终端的波特率等。

当程序自举时,内核创建进程ID为1的进程,也就是init进程。init进程使系统进入多用户状态。init进程读文件/etc/ttys,对每一个允许登录的终端设备,init调用一次fork,它所生成的子进程则执行(exec)getty程序。

fork and exec

init
------------------> getty   
(现在为两个进程,init为getty的父进程,两个进程的实际用户ID和有效用户ID都为0)

b、getty为终端设备调用open函数,以读、写方式将终端打开。如果设备是调制解调器,则open可能会在设备终端驱动程序中滞留,直到用户拨号调制解调器,并且呼叫并应答。一旦设备被打开,则文件描述符0、1、2就被设置到该设备。然后getty输出"login:"之类的信息并等待用户键入用户名。

当用户键入了用户名后,getty的工作就完成了。然后它以类似于下面的方式调用login程序:


execle("/bin/login","login","-p",username,(char *)0,envp);

init以一个空环境调用getty。getty以终端名和在gettytab中说明的环境字符串为login创建一个环境(envp参数)。

fork and
exec               
exec

init
------------------> getty ----------------> login

注意,现在还是只有两个进程,只不过之前的getty进程再次exec为login进程,getty和login进程ID相同,因为进程ID不会因执行exec而改变。并且,除了init进程,所有的父进程ID都为1.

login能执行多项工作,因为它得到了用户名,所以能调用getpwnam取得相应用户的口令文件登录项。然后调用getpass以显示"Password:",接着读用户键入的口令。如果用户几次键入的口令都无效,则login以参数1调用exit表示登录过程失败。父进程init了解到子进程的终止情况后,将再次调用fork,其后接着执行getty,对此终端重复以上过程。如果口令正确,则login进程完成一些登录用户的初始化工作,login进程的实际用户ID和有效用户ID改变为登录用户的用户ID(setuid)并调用该用户的登录shell。

c、到此为止,登录用户的登录shell开始执行。其父进程ID是init进程ID(进程ID为1),所以,当此登录shell终止时,init会得到通知(接到SIGCHLD信号),它会对该终端重复全部上述过程,将登录shell的文件描述符0、1、2设置为终端设备。

getty and
login                   
fd
0,1,2                               
硬链接

init
---------------------> shell <------------------> 终端设备驱动程序
<-------------> 终端用户

Linux终端登录

与BSD终端登录类似,在Linux中,/etc/inittab包含配置信息,它说明了init应当为之启动getty进程的各终端设备。

2、进程组

每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。它们与同一作业相关联。每个进程组有一个唯一的进程组ID。

通常是由shell的管道线将几个进程编成一组的。如
proc1 | proc2 &。

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

组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。进程组中的最后一个进程可以终止,或者转移到另一个进程组。

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

在大多数作业控制shell中(注意,这里提到作业控制shell,因为作业一般都与shell相关联),在fork之后调用setpgid函数,使父进程设置其子进程的进程组ID,并且使子进程设置其自己的进程组ID。这两个调用中有一个是冗余的,但让父子进程都这么做可以保证,在父、子进程认为子进程已进入了该进程组,这确实已经发生了。如果不这样做的话,那么fork之后,由于父、子进程运行先后次序的不确定,会造成在一段时间内(父、子进程只运行了其中一个)子进程组员身份的不确定(取决于哪个进程首先运行),这就产生了竞争条件。

3、孤儿进程组

定义:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。

另一种描述:一个进程组不是孤儿进程组的条件是,该组中有一个进程,其父进程在属于同一会话的另一个组中。

09.进程关系,布布扣,bubuko.com

时间: 2024-10-15 01:54:23

09.进程关系的相关文章

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

父子进程关系

1)父进程先于子进程终止: 此种情况就是我们前面所用的孤儿进程.当父进程先退出时,系统会让init进程接管子进程 . 2)子进程先于父进程终止,而父进程又没有调用wait或waitpid函数 此种情况子进程进入僵死状态,并且会一直保持下去直到系统重启.子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需.此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数. 僵死状态:一个已经终止.但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则

Linux进程关系

Linux进程关系 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux的进程相互之间有一定的关系.比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构.我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程. 进程组 (process group) 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程.进程组会有一个进程组领

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系

Linux 进程(二):进程关系及其守护进程

进程关系 进程组 进程组是一个或多个进程的集合.通常,它们是在同一作业中结合起来的,同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID.每个进程组有一个组长进程,该组长进程的ID等于进程组ID.从进程组创建开始到最后一个进程离开为止的时间称为进程组的生命周期. #include <unistd.h> pid_t getpgrp(void); 返回值:调用进程的进程组ID int setpgid(pid_t pid, pid_t pgid); 返回值:成功,返回0:

读书笔记-APUE第三版-(9)进程关系

登录过程 终端登录 init从/etc/ttys中读取终端信息,对每个允许登录的终端,都fork子进程,并执行getty.getty打开终端设备,执行login: execle("/bin/login,"login", "-p", username, (char *)0, envp) login进行用户名密码验证,同时还会进行切换到用户主目录/修改终端设备属主&读写权限/创建进程组/setuid等动作,然后运行login shell. execl(

进程关系

终端登录 inti进程使系统进入多用户状态,init进程读/etc/ttys,对每一个允许登录的终端设备调用一次fork,它所产生的子进程执行getty程序 getty为终端调用open函数,以读写方式打开终端,一旦终端被打开,则文件描述符0,1,2就被设置到该终端.getty输出:“login:”提示用户输入用户名 当用户输入用户名后,getty,以execle(“/bin/login”,”login”,”-p”,username,(char*)0),envp)这行login login得到用

Linux进程关系(转载)

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