终端&作业控制&会话启动过程
进程组
每个进程除了有个进程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 ...
随机推荐
- 关于cnas培训
关于cnas(2014-12-9----2014-12-12) 目的:完成内审相关知识培训,可以做一个合格的内审人员 过程: 1.为什么会存在实验室 2.iso9000是怎么产生的,以及存在的意义 3 ...
- Java中利用标签跳出外层循环break
直接看代码: class ForLoop{ public static void main(String[] args){ //jump from outer loop outer:for(int i ...
- jdk的设置及安装android studio提示does not point to a valid jvm问题
设置方法: 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量: JAVA_HOME值为:安装JDK的目录, 我的为C:\Program Files\Java\ ...
- java攻城狮之路(Android篇)--与服务器交互
一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...
- MYSQL开发性能研究——INSERT,REPLACE,INSERT-UPDATE性能比较
一.为什么要有这个实验 我们的系统是批处理系统,类似于管道的架构.而各个数据表就是管道的两端,而我们的程序就类似于管道本身.我们所需要做的事情无非就是从A表抽取数据,经过一定过滤.汇总等操作放置到B表 ...
- webgame设计之功能模块的代理模式
原文地址:http://chengduyi.com/blog/?post=27 在游戏设计中,通常会将一些实现了具体功能的模块进行封装,达到重用的目的.这些功能模块包括:1.网络通信模块(实现连接,断 ...
- 爬虫技术 -- 基础学习(四)HtmlParser基本认识
利用爬虫技术获取网页源代码后,针对网页抽取出它的特定文本内容,利用正则表达式和抽取工具,能够更好地抽取这些内容. 下面介绍一种抽取工具 -- HtmlParser HtmlParser是一个用来解析H ...
- window xp Apache与Tomcat集群配置--转载
转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...
- Hadoop入门进阶课程9--Mahout介绍、安装与应用案例
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan ...
- Shell基础整理
Shell的作用是将用户输入的文本命令转换成内核能识别的数据指令交给内核进行执行,内核需要翻译成二进制交由CPU底层来执行 用户层->Shell->调用对应应用程序->ke ...