终端&作业控制&会话启动过程
进程组
每个进程除了有个进程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 ...
随机推荐
- CSS - Select 标签在不同浏览器中的高度设置
当使用Select标签时,在不同浏览器中显示的高度不同,如何解决此问题: 解决方法链接:http://stackoverflow.com/questions/20477823/select-html- ...
- MSBuild .Targets 文件
MSBuild 附带几个 .targets 文件,这些文件包含常见方案中用到的项.属性.目标和任务.为了简化维护并增强可读性,系统自动将这些文件导入大多数 Visual Studio 项目文件中. 项 ...
- ubuntu系统从中文环境改成英文环境
我们在 安装ubuntu server版的时候,有人可能选择了中文环境安装,因为那样好设置时区等参数,可是安装好了后,运行某些命令的时候会有中文乱码提示,看起很是头蛋疼, 我们就需要将其改成英文环 ...
- Android 使用NDK编译sipdroid Library
sipdroid是一款开源的运行于Android平台上的voip,目前支持音频和视频通话: 项目拖管地址:http://code.google.com/p/sipdroid/ 下载源代码,导入ecli ...
- HMM MEMM & label bias
(http://blog.csdn.net/xum2008/article/details/38147425) 隐马尔科夫模型(HMM): 图1. 隐马尔科夫模型 隐马尔科夫模型的缺点: 1.HMM只 ...
- xfire框架内部基本结构解析
1 概述 xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello worl ...
- Node.js 的module 系统
相较于原生的JavaScript,不同的JavaScript文件之间很难共享变量.有鉴于此,Node.js在JavaScript的基础上进行了扩充,引入了require,exports,module三 ...
- 一款基于HTML5的Web 3D开发工具
在我们协助客户进行3D应用的开发过程中,客户遇到的最头疼的问题是如何在短时间内学会使用TWaver 3D引擎,以及使用TWaver 3D来创建和导入项目所需的各种3D业务模型.由于项目涵盖的行业繁多. ...
- CSS布局:Float布局过程与老生常谈的三栏布局
原文见博客主站,欢迎大家去评论. 使用CSS布局网页,那是前端的基本功了,什么两栏布局,三栏布局,那也是前端面试的基本题了.一般来说,可以使用CSSposition属性进行布局,或者使用CSSfloa ...
- Qt5 从头学(1)-- 环境
对我来说MFC太过麻烦了,同样是桌面开发工具,Qt就完全不一样了.Qt使用C++语言可以轻松实现"一次编写,到处编译"的跨平台性能,并且可以做出很多炫酷的界面效果.目前支持几乎所有 ...