Unix环境高级编程—进程关系
终端登录
网络登录
进程组
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环境高级编程—进程关系的更多相关文章
- UNIX环境高级编程——进程关系
一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...
- UNIX环境高级编程——进程管理和通信(总结)
进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程 动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合 是个文件,可直观看到 程序program ...
- Unix环境高级编程—进程控制(二)
一.函数wait和waitpid 今天我们继续通过昨天那个死爹死儿子的故事来讲(便于记忆),现在看看wait和waitpid函数. #include<sys/wait.h> pid_t w ...
- UNIX环境高级编程——进程基本概述
一.什么是进程 从用户的角度来看进程是程序的一次执行过程.从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位.进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行 ...
- UNIX环境高级编程——进程控制
一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...
- UNIX环境高级编程——进程环境
一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...
- unix环境高级编程----进程控制wait()
一.wait()函数 当一个进程中调用wait()函数的时候 (1)假设其全部的子程序都还在执行,则堵塞 (2)假设一个子进程已终止.则等待父进程获取其终止状态. (3)假设没有子进程,则返回错误. ...
- Unix环境高级编程—进程控制(三)
一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...
- UNIX环境高级编程——进程间通讯方法整理
一.无名管道pipe #include <unistd.h> int pipe(int fd [2]) 二.fifo #include <sys/stat.h> int mkf ...
随机推荐
- AC日记——黑魔法师之门 codevs 1995
1995 黑魔法师之门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 经过了16个工作日的紧张 ...
- JWT在PHP使用及问题处理
官网 https://jwt.io/ 3.0版本 https://github.com/lcobucci/jwt 安装 composer require lcobucci/jwt 依赖 PHP 5.5 ...
- UVA 725 division【暴力枚举】
[题意]:输入正整数n,用0~9这10个数字不重复组成两个五位数abcde和fghij,使得abcde/fghij的商为n,按顺序输出所有结果.如果没有找到则输出“There are no solut ...
- [读书笔记] JavaScript设计模式: 单例模式
单例模式:保证一个类只有一个实例,并提供一个可以访问它的全局访问点. 一种简单.方便的写法就是用一个变量来标识当前类是否已经创建过对象,如果有,则返回已经创建好的对象,否则创建一个新对象,并将其返回. ...
- TIDB 安装
https://my.oschina.net/dmdgeeker/blog/718564 SQL 层一直是用 Golang 在开发,存储引擎 TiKV 用的 Rust
- ios与js交互获取webview元素和赋值
使用webview的stringByEvaluatingJavaScriptFromString的方法交互,直接提供实例. 下载:http://download.csdn.net/detail/hey ...
- Displaying Tabbed and Stacked Canvas Using Show_View In Oracle Forms
Displays the indicated canvas at the coordinates specified by the canvas's X Position and Y Position ...
- weblogic控制台登录很慢
分类: Oracle 原文地址:weblogic控制台登录很慢 作者:paomananshan 实际是JVM在Linux下的bug 他想调用一个随机函数 但取不到 暂时的解决办法是 1)较好的解决 ...
- Unity -- 材质-Material和预设体-Prefabs
材质(Materials)用来把网格(Mesh)或粒子渲染器(Particle Renderers)贴到游戏对象上.他们在定义对象怎么被显示发挥重要组成部分.材质包括用于呈现网状或颗粒着色器的参考,所 ...
- selenium遇到不可编辑input和隐藏input如何赋值
js = 'document.getElementsByName("m:csr_mt_gnccspjclfbxd:bmshldID")[0].type="text&quo ...