终端&作业控制&会话启动过程
进程组
每个进程除了有个进程id外,还属于一个进程组。进程组是一个或者多个进程的集合。通常他们与同一个作业相关联,可以接受来自同一终端的信号。进程组id等于其进程组长id。进程组的终止与进程组长是否存在无关,只要有一个成员进程存在,那么这个进程组就存在。
作业
shell分前后台进行控制的不是进程而是作业或者进程组。一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成。shell可以运行一个前台作业和多个后台作业,这称为作业控制。
作业与进程组的区别:如果一个作业中的某个进程创建了一个子进程,那么这个子进程不属于作业,但属于进程组。
会话
会话是一个或者多个进程组的集合。
一个会话可以有一个控制终端。建立与控制终端连接的会话首进程被称为控制进程。
注:通过管道方式实现一个作业任务。
前两行:对比可以看出,两个sleep命令的PPID(父进程id:bash),PGID(进程组ID),SID(会话ID),TTY(终端)都是相同的。
PID是不同的,他们是一个进程组中的两个不同进程。
将之与第三行对比,发现,各个项都是不同的,特别是SID,TTY,TPGID(top PGID(前台进程组ID))都是不同的。
ps -e 或 ps -o pid,ppid,session,tpgid, comm (其中session显示的sessionid, tpgid显示前台进程组id, comm显示命令名称)
同时,我们可以验证,SID会话ID是由每个终端进行确定的。
由这个图我们更可以清晰的理解到,对于每一个连续的命令执行流,其进程组/作业id是相同的。会话id则是终端相关的。
#include <stdio.h>
#include <unistd.h> int main(int argc, char const *argv[])
{
printf("fd: %d -> %s\n",,ttyname() );
printf("fd: %d -> %s\n",,ttyname() );
printf("fd: %d -> %s\n",,ttyname() );
return ;
}
现在我们来看终端登录的过程:
1、系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端。例如配置文件中有
这样一行:
1:2345:respawn:/sbin/getty 9600 tty1
和/etc/passwd类似,每个字段用用:号隔开。开头的1是这一一行行配置的id,通常要和tty的后缀一一致,配置tty2的那一一行行id就应该是2。第二二个字段2345表示示运行行级别2~5都执行行这个配置。最后一个字 段/sbin/getty 9600 tty1是init进程要fork/exec的命令,打开终端/dev/tty1,波特率 是9600(波特率只对串又口口和Modem终端有意义),然后提示示用用户输入入帐号。中间的respawn字段表示示init进程会监视getty进程的运行行状态,一一旦该进程终止止,init会再次fork/exec这个命令,所以 我们从终端退出登录后会再次提示示输入入帐号。
2、getty根据命令行行参数打开终端设备作为它的控制终端,把文文件描述符0、1、2都指向控制终 端,然后提示示用用户输入入帐号。用用户输入入帐号之后,getty的任务就完成了,它再执行行login程序:
execle("/bin/login", "login", "-p", username, NULL, envp);
3、如果密码不正确,login进程终止止,init会重新fork/exec一一个getty进程。如果密码正确,login程 序设置一一些环境变量,设置当前工工作目目录为该用用户的主目目录,然后执行行Shell:
execl("/bin/bash", "-bash", NULL);
从getty开始exec到login,再exec到bash,其实都是同一一个进程,因此控制终 端没变,文文件描述符0、1、2也仍然指向控制终端。由于fork会复制PCB信息,所以由Shell启动的 其它进程也都是如此。
从会话角度讲 终端开启过程是:
1。getty或者telnetd调用setsid,设置会话id,在这个id的基础上开启终端,建立会话。同时创建一个进程组。且该进程是此终端下所有会话的控制终端。
2。登录过程中,进行exec替换。变为login,然后变为shell
3。当shell调用fork创建子进程进行工作时,调用setpgid将作业中的某个进程设置伪新的组进程,形成本会话内的一个作业流。
注:在作业中,如果某个进程创建新的子进程了,该子进程并不会作为作业内容而被等待。当真是作业完成时,作业就会退出。(进程组和作业的区别)。
关于作业的命令:
jobs查看当前系统执行作业
process & 将process作为后台作业执行。
bg 将作业改为后台执行
fg 将作业改为前台执行
参数的话, %1 表示作业号为1
lang@liang:~/linux/thread$ cat fsdf &
[]
lang@liang:~/linux/thread$ fsdf
给一个需要写入终端的命令设置后台执行时,并不能成功。
这时我们需要设置stty tostop 禁止后台进程写。然后才能成功
终端&作业控制&会话启动过程的更多相关文章
- Linux启动过程详述
http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...
- Linux 启动过程详解
目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...
- zookeeper源码分析之一服务端启动过程
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
- (转)Linux的启动过程
原文链接:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 半年前,我写了<计算机是如何启动的?>,探讨BIOS ...
- Nginx学习笔记(六) 源码分析&启动过程
Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...
- 走进Linux之systemd启动过程
Linux系统的启动方式有点复杂,而且总是有需要优化的地方.传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问 ...
- Android启动过程以及各个镜像的关系
Android启动过程 Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中.可以 ...
- 通过gdb调试分析Linux内核的启动过程
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验流程 1.打开环境 执 ...
- nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?
我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...
随机推荐
- 修改CMD的编码
修改CMD的编码 使用chcp命令,格式为chcp [nnn]后面3位数字为codepage number.简体中文为936UTF8 为 65001United States 为 437
- 使用NSKeyedArchiver归档
将各种类型的对象存储到文件中,而不仅仅是字符串.数组和字典类型,有一种更灵活的方法.就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成. Mac OS X从版本10.2开始支 ...
- Recover Binary Search Tree--leetcode难题讲解
Two elements of a binary search tree (BST) are swapped by mistake.Recover the tree without changing ...
- npm命令总结
统一切换到项目目录 安装redux :npm install -save redux 安装react-redux : npm install -save react-redux
- 解析表达式到lucene.net的Query
查询的时候有自己的查询格式,为了统一并且方便的搜索lucene.net 于是就写了个解析格式,大体上覆盖了几乎所有的lucene.net的query了.当然少了公共扩展库里包含的regexQuery, ...
- 如何准备PMP考试?
东西在精,而不在多.话不多说,干货如下: 1.参加培训,不要持续时间太长,通常情况下3个月时间足够了:许多和我一起参加培训的学员,有时候准备6个月时间,反而没有3个月冲刺的时间考试结果好. 2.培训老 ...
- 【PRML读书笔记-Chapter1-Introduction】引言
模式识别领域主要关注的就是如何通过算法让计算机自动去发现数据中的规则,并利用这些规则来做一些有意义的事情,比如说,分类. 以数字识别为例,我们可以根据笔画规则启发式教学去解决,但这样效果并不理想. 我 ...
- 记一个dynamic的坑
创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问它,代码如下: namespace ConsoleApplication1 { class Program { static ...
- 直接拿来用!最火的Android开源项目
GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...
- CentOS6.5菜鸟之旅:U盘安装CentOS64位
一.前言 之前下载了个CentOS7 32位版,一下就安装成功了,但由于其目录结构等与之前的CentOS版本有很大的不同,加上教程不多不利于我这种菜鸟学习,于是决定重装CentOS6.5来学习.本篇用 ...