终端登录

网络登录

进程组

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. hexo添加百度统计

    litten的主题yilia 编辑文件 themes/yilia/_config.yml,添加一行配置,可以删除原来的google analytics baidu_tongji: true 新建 th ...

  2. Codeforces 716C. Plus and Square Root-推公式的数学题

    http://codeforces.com/problemset/problem/716/C codeforces716C. Plus and Square Root 这个题就是推,会推出来规律,发现 ...

  3. 深入Java数据类型

    Java的数据类型分为两大类,一类是基本数据类型,还有一类就是引用数据类型. 1.基本数据类型 Java一共有8种基本数据类型,分别是byte,short,int,long,float,double, ...

  4. luogu P1304 哥德巴赫猜想

    题目描述 输入N(N<=10000),验证4~N所有偶数是否符合哥德巴赫猜想. (N为偶数). 如果一个数,例如10,则输出第一个加数相比其他解法最小的方案.如10=3+7=5+5,则10=5+ ...

  5. 【JSOI2007】文本生成器

    用AC自动机处理所有了解的单词 显然,不能直接算,直接算的话,我们需要大力容斥,复杂度不允许 我们不妨反过来做,我们根据AC自动机处理出所有的不可行解,然后用总数减去即可 计算所有不可行解用dp,\( ...

  6. su su- sudo

    su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码. linux su 命令 建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .s ...

  7. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

  8. Android Retrofit RxJava实现缓存

    RxJava如何与Retrofit结合参考:http://blog.csdn.net/jdsjlzx/article/details/52015347 缓存配置 app网络数据的离线缓存实现有很多种办 ...

  9. VS2010 MFC中 在FormView派生类里获取文档类指针的方法

    经过苦苦调试,今晚终于解决了一个大问题. 我想要实现的是:在一个FormView的派生类里获取到文档类的指针. 但是出现问题:试了很多办法,始终无法获取到. 终于,此问题在我不懈地调试加尝试下解决了. ...

  10. 终于会用c#中的delegate(委托)和event(事件)了 [转]

    原文 : http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html 一.开篇忏悔 对自己最拿手的编程语言C#,我想对你 ...