进程组

每个进程除了有个进程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 禁止后台进程写。然后才能成功

终端&作业控制&会话启动过程的更多相关文章

  1. Linux启动过程详述

    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...

  2. Linux 启动过程详解

    目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. (转)Linux的启动过程

    原文链接:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 半年前,我写了<计算机是如何启动的?>,探讨BIOS ...

  5. Nginx学习笔记(六) 源码分析&启动过程

    Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...

  6. 走进Linux之systemd启动过程

    Linux系统的启动方式有点复杂,而且总是有需要优化的地方.传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问 ...

  7. Android启动过程以及各个镜像的关系

    Android启动过程 Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中.可以 ...

  8. 通过gdb调试分析Linux内核的启动过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验流程 1.打开环境 执 ...

  9. nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

    我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...

随机推荐

  1. 如何在wp8 中调试cocos2dx c++ 代码

    有的时候在win32上运行良好的cocos2dx程序移植到wp8的时候就出了问题,我们想把断点放到c++代码中,需要设置一下VS 2012 右击项目属性 把ui任务 设置为仅限本机 即可.

  2. U3D包大小优化之microlib

    当迩想把最小类库发上来,迩需要把Stripping Level设置为Use micro mscorlib 这里是MICROLIB所能使用的包的类库列表:http://docs.unity3d.com/ ...

  3. Cannot open connection 解决办法

    试了很多种网上找的办法,都不行,最后才发现是我的beans.xml中完全把下面 这一段代码给遗忘了,忘记写了.添加我就ok了. 我能说花了我近1个小时吗?坑姐哦! <bean class=&qu ...

  4. wireshark使用笔记

    tcp && (ip.src==xxx.xxx.xxx.xxx || ip.dst==yyy.yyy.yyy.yyy)

  5. 引入HBase依赖包带来的麻烦

    在一个项目里用到HBase做底层存储,使用maven来管理相关Jar包依赖,用maven来管理依赖包,特别不爽的就是他会将你引入Jar包自己的依赖都搞进来,经常会出现一些类和方法冲突找不到等状况.这次 ...

  6. tengine-2.1.0 + GraphicsMagick-1.3.20

    export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0/./configure --prefix ...

  7. Query Object--查询对象模式(下)

    回顾 上一篇对模式进行了介绍,并基于ADO.NET进行了实现,虽然现在ORM框架越来越流行,但是很多中小型的公司仍然是使用ADO.NET来进行数据库操作的,随着项目的需求不断增加,业务不断变化,ADO ...

  8. Qt 判断文件是否存在

    包含头文件:<QFileInfo> 代码: QFileInfo file("文件路径"); if(file.exists()==false){文件不存在:}

  9. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...

  10. Hadoop入门进阶课程13--Chukwa介绍与安装部署

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...