分享
 
 
 

UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: |||超大  

UNIX高级环境编程(12)进程关联(PRocess Relationships)- 终端登录过程 ,进程组,session在前面的章节我们了解到,进程之间是有关联的:

每个进程都有一个父进程;子进程退出时,父进程可以感知并且获取子进程的退出状态。本章我们将了解:

进程组的更多细节;sessions的内容;login shell和我们从login shell启动的进程之间的关系。?

一 终端登录(Terminal Logins)BSD Terminal Logins?BSD终端的登录程序在过去35年都没有改变。

系统管理员(the system adminstrator)创建一个文件 /etc/ttys,每一个登录终端都在该文件占一行,改行包含登录终端名,其他的参数则会传递给getty函数。其中一个参数是终端的传输波特率(baud rate)。当系统引导完成,内核创建init进程,进程ID为1。init进程负责引导系统启动。init进程读取文件/etc/ttys,并为每一个登录设备fork一个进程,然后执行exec运行getty程序。?上面的流程如下图所示:

由init进程fork创建的进程的real user ID为0,effective user ID为0,并且他们都有超级用户权限。

程序getty的职责:为终端设备调用open函数,一旦设备被打开,文件描述符0,1,2被设置给该设备。然后getty输出一些提示符,等待我们输入用户名。当我们输入用户名后,getty的工作就完成了,然后通过调用exec函数执行登录函数,如下。

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

增加了login程序后,流程如下图所示:

上图中fork出来的进程都有超级用户权限,因为他们都是从init进程fork出来,而init进程有超级用户权限。

下面的进程的进程ID都是相同的,因为exec函数不改变进程的ID,并且他们的父进程的ID都是1。

现在登录程序转到login程序执行,login程序会做下面的事情:

根据我们输入的用户名,调用函数getpwnam获取用户名对应的密码;调用函数getpass打印提示符 PassWord: ,等待读取我们输入的密码;对我们输入的密码进行加密,将加密后的密码和从系统密码文件获取的密码进行对比,如果密码不同,则login程序调用exit函数退出,并返回退出状态1。init进程得到1的进程终止状态,则会再次执行fork进行登录重试。如果我们正确登录,则login程序会继续做下面的事情:

当前工作目录切换到我们的主目录(chdir);改变我们的终端设备的所有权为我们自己所有(chown);改变我们的终端设备的权限,使得我们可以从该终端设备读取和输入;设置我们的组ID(setgid和initgroups);初始化我们的环境变量;改变我们的用户ID(setuid),激活我们的登录shell ,如execl(“/bin/sh”, “-sh”, (char *)0);?过程如下图所示:

我们的shell已经启动后,会去读取启动文件(.profile或.bash_profile或.bash_login或.profile,不同的系统启动文件的命名不同)。这些启动文件的作用是增加系统的环境变量,设置一些全局变量,链接等。

?

2 网络登录(Network Logins)物理登录和网络登录的区别在于:登录终端到主机的连接是否是点对点的。

网络登录情况下,登录是一种可用服务,就像其他的服务,如FTP或SMTP。

网络登录服务特点是不知道会有多少登录请求会来。所以内核不是在等待每一个可能的登录,而是通过网络接口驱动(network interface drivers)在等待一个网络连接登录请求。

为了统一处理物理登录和网络登录,一个软件驱动,叫做虚拟终端(pseudo terminal)被用来用将网络登录后的行为请求映射为真实终端的行为。

BSD Network Logins进程inetd等待处理大部分的网络连接。

下面我们将了解网络登录的过程。

系统启动时,init进程创建一个shell执行脚本/etc/rc,其中一个后台进程就是inetd。一旦该脚本终止,inetd进程的父进程就成为了init进程;inetd的职责是等待TCP/IP连接请求,一旦有新的连接请求到来,inetd会执行fork and exec执行相应的处理程序;telnetd程序会启动一个TELNET服务器,等待用户远程登录,用户通过TCP协议链接服务器,并通过合法的用户密码进行登录。启动telnetd程序的过程如下图所示:

?

telnetd进程启动后的动作为:

打开一个虚拟终端(pseudo teminal),然后调用fork创建出两个进程;父进程处理来自网络的连接请求;子进程执行exec函数调用login程序;父进程和子进程通过虚拟终端链接;如果子进程正确登录,则后面的过程和物理登录相同。过程如下图所示:

?

?3 进程组(Process Groups)每一个进程都属于一个进程组。

进程组是一些进程的集合,这些进程常常关联于同一个job,并且从同一个终端接收信号。

每一个进程组都有一个唯一的进程组ID。

函数getpgrp返回调用进程的进程组ID。

函数声明:

?#include <unistd.h>

pid_t getpgrp(void);

? ? ? ? // Returns: process group ID of calling process

?

pid_t getpgid(pid_t pid);

? ? ? ? // Returns: process group ID if OK, -1 on error

函数调用getpgid(0); 和函数调用getpgrp(); 作用相同,都返回调用进程的进程组ID。

每个进程组都有个头进程,该进程的进程ID和进程组ID相同。

进程组的生命周期:从一个进程创建一个组开始,只到最有一个组内进程终止或者成为另外一个组的进程为止。

一个进程可以调用函数setpgid加入到另一个进程组或者创建一个进程组。

函数声明:

?#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);

函数设置进程ID为pid的进程的进程组ID为pgid。

如果pid和pgid相同,都为某个进程的进程ID,则进程pid成为一个进程组的头进程。

如果pid为0,则表示待设置的进程为当前进程。

?

4 Sessions一个session是一个或几个进程组的集合。

例如下图所示:

一个进程通过调用函数setsid创建一个新的session。

函数声明:

?#include <unistd.h>

pid_t setsid(void);

? ? ? ? // Returns: process group ID if OK, -1 on error

如果调用进程不是组头进程,则会发生三件事:

该进程成为创建的新session的session leader;该进程成为一个新进程组的头进程,新进程组ID为该调用进程的进程号;该进程不关联终端。函数getsid返回一个session leader进程的进程组ID。

函数声明:

#include <unistd.h>

pid_t getsid(pid_t pid);

? ? ? ? // Returns: session leader’s process group ID if OK, -1 on error

如果pid为0,函数getsid返回调用进程所在的session leader进程的进程组号。

?

?

参考资料:

《Advanced Programming in the UNIX Envinronment 3rd》

?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有