终端登录

网络登录

进程组

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. LeetCode OJ-- Combination Sum II **

    https://oj.leetcode.com/problems/combination-sum-ii/ 一列数,每个数只能用一次或者不用,给出和为target的组合. 递归写的深搜,使用了编程技巧, ...

  2. iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决

    byzqk 新版,加入连麦功能,直播的流程修改很多,每次登录都需要登录liveroom组件 期间遇到一个奇葩的问题,就是游客登录组件之后,切换为用户登录,出现im消息重复的问题,一开始以为是游客退出不 ...

  3. [Machine Learning with Python] Cross Validation and Grid Search: An Example of KNN

    Train model: from sklearn.model_selection import GridSearchCV param_grid = [ # try 6 (3×2) combinati ...

  4. Hdoj 2509 Be the Winner

    Diciption Let's consider m apples divided into n groups. Each group contains no more than 100 apples ...

  5. ural 1519 fomular 1 既插头DP学习笔记

    直接看CDQ在2008年的论文吧. 个人认为她的论文有两个不明确的地方, 这里补充一下: 首先是轮廓的概念. 我们在进行插头DP时, 是从上往下, 从左往右逐个格子进行的, 已经处理的格子与未经处理的 ...

  6. 转:IAdaptable & IAdapterFactory

    IAdaptable & IAdapterFactory在Eclipse中使用IAdaptable接口的方式有两种 在Eclipse中使用IAdaptable接口的方式有两种1:某个类希望提供 ...

  7. ef SaveChanges()报"更新条目时出错,有关详细信息请参见内部异常"

    报这个错误是因为表没有设置主键,设完主键后再重新更新Entity,就可以添加了

  8. python测试网络可达性的方法

    1.ping连通性测试 #!/usr/bin/env python #-*- coding: utf-8 -*- import os,sys,re import subprocess def NetC ...

  9. 有关javaScript面向对象和原型笔记

    javaScript是一种比較特殊的语言,ECMAScript中没有类的概念.跟其它面向对象的语言有一定的差别.它的对象也与基于类的语言中的对象有所不同,严格来说,javascript对象是一组没有特 ...

  10. CentOS7.0修改主机名(hostname)

    Linux中的hostname在大多数应用中至为重要,例如有些应用强制使用主机名称而不能使用IP地址,如果默认主机名称都为localhost.localdomain 的话那一定会出现问题,而且看起来也 ...