终端登录

网络登录

进程组

getpgrp(void)

setpgid(pid_t pid, pid_)

会话: 是一个或多个进程组的集合,通常由shell的管道将几个进程编成一组。

setsid(void)

getsid(pid_t pid)

会话建立过程,简述:

其中,xinetd守护进程在监听到有客户端请求ssh连接后,fork一个子进程xinetd,然后该子进程exec执行sshd程序(也就图中的PPID为),而父进程xinetd则继续监听网络中其他连接请求的到来。

sshd程序调用login程序,抛出一个登录shell(图中PID为),此时该进程权限为root权限,同时,打开文件描述符0,1,2,方便用户进行输入用户名密码这两个简单的交互,如果用户名密码准确无误,则fork一个新的进程作为控制终端(pts/0,该进程ID为),并降低权限,由root权限更改为登录用户名对应的权限。最后,由控制终端fork一个控制进程,来作为与控制终端连接的会话首进程,也就是图中的PID为的进程,至此,一个完整的会话建立完毕,我们在这个伪终端中执行的任何命令的进程的PPID都应该为11086(如图中ps -ef ,grep webber的父进程都是11086),因为它们都是在这个会话中完成的,而这个会话首进程的进程组ID为11086.

注:一个会话只能有一个前台进程组,其他进程组为后台进程组。在终端键入中断键(Ctrl+C),都会将信号送到前台进程组fg,如果将挂断信号发送到控制进程(会话首进程11086),则pts断开连接。

保证程序能与控制终端对话的方法是open文件 /dev/tty或 /dev/pts/0

作业控制:

终端IO和终端产生的信号总是从前台进程组连接到实际终端。

后台进程的输出是否出现在终端是可选择的,如果选择让后台进程输出不出现在终端(用 stty 命令),则SIGTTOU会将该进程在后台阻塞。

对于前台、后台作业以及终端驱动程序的作业控制功能如下图:

Shell执行程序

使用的登录shell不同,则创建各个进程的顺序也可能不同。

ps -o pid,ppid,pgid,tpgid,sid,comm|cat |cat

对于这条命令,在shell环境下,首先创建执行管道中最后一个cat的进程,然后它fork两个进程,分别是倒数第二个cat和第一个ps,然后它们分别执行exec,通过管道完成任务(这里可能产生竞争条件),最终输出到终端。而在Bash环境下,Bash将是管道中三个命令的父进程,bash是后台进程,而那三个命令是前台进程。

孤儿进程组:

这里所说的孤儿进程组其实很好理解,我们可以举一个最简单的例子,在我们通过pts创建一个会话时,在/bin/bash的登录环境下,系统会指定一个会话首进程来作为其他命令进程的父进程,这个会话首进程会做为后台进程组的组长(假设PID=1000),这时,我们可以执行一段代码在前台执行(假设执行程序的进程的PID=2000),在这段代码中fork了一个子进程(假设PID=3000),那么PID为2000和3000的父子进程组成了一个前台进程组,其中,父进程PID=2000的作为前台进程组的组长。那么,当我们先把PID=3000的子进程挂起停止运行后,再杀死PID=2000的父进程或者父进程主动exit,这时,这个只有PID=3000的子进程的前台进程组成为孤儿进程组,被init收养,同时,这个前台进程组变为后台进程组,而会话首进程PID=1000的进程组成为前台进程组。这时内核可以向孤儿进程组发送SIGCONT信号,使孤儿进程组继续执行。

注意,对于孤儿进程组,如果内核用SIGTTIN信号去停止它,则此进程组就再也不会继续执行,不在接受SIGCONT信号。POSIX.1要求向新孤儿进程组中处于停止状态的每一个进程发送挂掉信号(SIGHUP),接着向其发送继续信号(SIGCONT)。

Unix环境高级编程—进程关系的更多相关文章

  1. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  2. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  3. Unix环境高级编程—进程控制(二)

    一.函数wait和waitpid 今天我们继续通过昨天那个死爹死儿子的故事来讲(便于记忆),现在看看wait和waitpid函数. #include<sys/wait.h> pid_t w ...

  4. UNIX环境高级编程——进程基本概述

    一.什么是进程 从用户的角度来看进程是程序的一次执行过程.从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位.进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行 ...

  5. UNIX环境高级编程——进程控制

    一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...

  6. UNIX环境高级编程——进程环境

    一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...

  7. unix环境高级编程----进程控制wait()

    一.wait()函数 当一个进程中调用wait()函数的时候 (1)假设其全部的子程序都还在执行,则堵塞 (2)假设一个子进程已终止.则等待父进程获取其终止状态. (3)假设没有子进程,则返回错误. ...

  8. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

  9. UNIX环境高级编程——进程间通讯方法整理

    一.无名管道pipe #include <unistd.h> int pipe(int fd [2]) 二.fifo #include <sys/stat.h> int mkf ...

随机推荐

  1. 网络请求失败记录(安卓4g网络下第一次请求特别慢或者失败)

    最近app的一次版本上线以后出现4g网络下请求接口特别慢,第一次调用接口非常非常慢或者直接访问失败,后面就正常了,但是WiFi情况下并不会出现这个问题.最主要的是IOS的线上app并没有问题. 开始怀 ...

  2. CSU 1779: 错误的算法【矩阵/模拟】

    Description 有道题目是这样的: 输入一个 n 行 m 列网格,找一个格子,使得它所在的行和列中所有格子的数之和最大.如果答 案不唯一,输出任意解即可.比如,在下面的例子中,最优解是(1,3 ...

  3. CSU 1777: 大还是小?【模拟/后导0】

    293419 roniking 1777 Accepted 2032 0 C++ 2000 2018-04-03 19:21:25 Description 输入两个实数,判断第一个数大,第二个数大还是 ...

  4. sprintf 心得

    [string print format]sprintf指的是字符串格式化命令. [主要功能]是把格式化的数据写入某个字符串中. sprintf是个变参函数. 使用sprintf对于写入buffer的 ...

  5. Codeforces 782B The Meeting Place Cannot Be Changed(二分答案)

    题目链接 The Meeting Place Cannot Be Changed 二分答案即可. check的时候先算出每个点可到达的范围的区间,然后求并集.判断一下是否满足l <= r就好了. ...

  6. Codeforces 743D Chloe and pleasant prizes(树型DP)

                                                                D. Chloe and pleasant prizes             ...

  7. Spring Cloud Feign 声明式服务调用

    目录 一.Feign是什么? 二.Feign的快速搭建 三.Feign的几种姿态 参数绑定 继承特性 四.其他配置 Ribbon 配置 Hystrix 配置 一.Feign是什么? ​ 通过对前面Sp ...

  8. asp.net获取URL方法

    方法如下: Request.Url.ToString()获取完整url(协议名+域名+站点名+文件名+参数):https://localhost:44300/WebForm1.aspx?abc=123 ...

  9. android windowSoftInputMode属性详解(转)

    activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一]当有焦点产生时,软键盘是隐藏还是显示 [二]是否减少活动 ...

  10. VC++动态链接库(DLL)编程深入浅出(四)

    这是<VC++动态链接库(DLL)编程深入浅出>的第四部分,阅读本文前,请先阅读前三部分:(一).(二).(三). MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用M ...