终端&作业控制&会话启动过程

进程组

每个进程除了有个进程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",0,ttyname(0) );
    printf("fd: %d -> %s\n",1,ttyname(1) );
    printf("fd: %d -> %s\n",2,ttyname(2) );
    return 0;
}

现在我们来看终端登录的过程:

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

[email protected]:~/linux/thread$ cat fsdf &
[2] 6470
[email protected]:~/linux/thread$ fsdf

给一个需要写入终端的命令设置后台执行时,并不能成功。

这时我们需要设置stty tostop 禁止后台进程写。然后才能成功

时间: 2024-11-09 23:01:51

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

linux基础:5、linux启动过程

linux启动过程 1.BIOS(basic in out system) 通电检查硬件,然后加载第一可用启动项的mbr: #可通过BIOS设置各种介质存储设备的启动顺序,比如:cdrom.disk.usb 2.MBR(main boot recorder) 磁盘的第一个扇区,共512字节,446字节的boot程序空间,64字节的分区表,2字节的校验位. 执行MBR内保存的boot loader程序,一般为GRUB,通过GRUB来找到kernel和initrd(centos6里面此文件更名)并将

VxWorks启动过程具体解释(下)

上一节主要是从映像的分类和各种映像的大致载入流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程: 1. Boot Image + Loadable Images: 以下是详细的流程图: 当中第一阶段的运行流程使用的是上图的左边的源文件里的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二阶段运行流程使用的是上图中右边源文件里的那些函数(sysInit-&

Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程

陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输

Linux系统--Linux的启动过程

Linux系统--Linux启动过程 CentOS 启动流程: POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --

程序的启动过程

WIN32程序启动过程 第一步:操作系统首先创建响应的进程并分配私有的进程空间,然后操作系统的加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内容空间中. 第二步:加载器读入可执行程序的导入符号表,根据这些符号表可以查找出该可执行程序所有依赖的动态链接库. 第三步:加载器针对该程序依赖的每一个动态链接库调用LoadLibrary. 查找对应的动态库文件,加载器为该动态链接库确定一个合适的基地址.如果该基地址和动态链接库希望加载的基地址不同,加载器还要为该库做rebase,然后把整个动态链接

mysql启动过程

明白/etc/init.d/mysql从哪里来,和mysql.server什么关系? /etc/init.d/mysql和mysqld_safe之间的关系 mysqld_safe怎么把mysql启动起来的 mysql就是mysql.server拷贝到这里来的. mysql启动,调用mysqld_safe mysqld_safe调用mysqld将mysql启动起来. 扩展知识:mysqld_safe是mysqld的一个看门狗进程 ps -axu | grep mysql找到mysql的pid ki

centos7的启动过程

开机启过程 POST->BOOT     SEQUENCE-> BOOTLOADER->KERNEL +     INITRAMFS(INITRD)->ROOTFS->/sbin/init POST:加电自检 当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,

centos7启动过程及systemd祥细说明

开机启过程 POST->BOOT SEQUENCE-> BOOTLOADER->KERNEL + INITRAMFS(INITRD)->ROOTFS->/sbin/init POST:加电自检 当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,不会继续往下走.

workerman源码分析之启动过程

PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了.记得有一次问walker,PHP能做什么?他说:什么都能做啊!当时我就震惊了,这怎么可能...直到后来一直看workerman源码,发现PHP原来有很多不为大家所知的诸多用法,包括多进程(还有线程).信号处理.namespace等等一大堆特点.而workerman正是这些很少被使用特性(或者说扩展