Linux/UNIX流程关系

流程关系

过程组

除了一个过程,每个过程ID此外。也属于一个进程组。过程基是一个或多个过程的集合。

通常它们与相同的作业相关联,它接受各种信号从相同终端。

#include<unistd.h>

pid_tgetpgrp(void);                 /* POSIX.1version */

pid_t getpgid(pid_tpid);

intsetpgid(pid_t pid, pid_t pgid);

函数getpgrp返回调用进程的进程组ID。

getpid函数也有此功能。

进程能够通过调用setpgid来增加一个现有的组或创建一个新进程组。

会话

会话是一个或多个进程组的集合。

一般是由shell的管道将几个进程编成一组的。例如以下所看到的:

proc1 | proc2 &

proc3 | proc4 | proc5

其会话安排例如以下:

进程调用setsid函数建立一个新会话。

#include <unistd.h>

pid_t setsid(void);

还可调用getsid来返回会话首进程的进程组ID

#include <unistd.h>

pid_t getsid(pid_t pid);

控制终端

登录时,将自己主动创建控制终端。

程序与控制终端交互时,为保证程序能读写控制终端的方法是打开文件/dev/tty。在内核中,词特殊文件是控制终端的同义语。假设程序没有控制终端,则打开此设备将失败。

1.      一个会话能够有一个控制终端

2.      建立与控制终端联结的会话收进程被称为控制进程

3.      一个会话中的几个进程组可被分成一个前台进程组以及一个或几个后台进程组

4.      假设一个会话有一个控制终端。则它有一个前台进程。会话中的其它进程组则为后台进程组

5.      不管何时键入终端的中断键,就会将中断信号发送给前台进程组的全部进程

6.      不管何时键入终端的退出键,就会将退出信号发送给前台进程组的全部进程

7.      假设终端接口检測到的调制解调器已经断开网络。则将挂断信号发送给控进程。

tcgetpgrp、tcsetpgrp和tcgetsid函数

#include <unistd.h>

pid_t tcgetpgrp(int fd);

int tcsetpgrp(int fd, pid_t pgrp);

tcgetpgrp函数返回调用前台进程的进程组ID,该前台进程组与在fd上打开的终端相关联。

假设进程有一个控制终端,则该进程能够调用tcsetpgrp将前台进程组ID设为pgrp。fd必须引用该会话的控制终端。

#include<termios.h>

pid_ttcgetsid(int fd);

该函数识别出控制终端的会话首进程的会话ID。

作业控制

作业控制同意在一个终端上启动多个作业(进程组),他控制哪个作业能够訪问终端,以及那些作业也在后台执行。

[email protected]:~$ cat > temp.foo &  在后台启动,但将从标准输入读

[1] 3894

[email protected]:~$

键入回车

[1]+  Stopped                 cat > temp.foo

[email protected]:~$fg %1         使1号作业成为前台作业

cat >temp.foo                    shell告诉我们如今哪一个作业在前台

hello,world                     输入1行,后面接文件结束符(ctrl+D)

[email protected]:~$cat temp.foo   检查该行已送入文件

hello,world

[email protected]:~$

shell在后台启动cat进程,可是当cat视图读其标准输入时,终端驱动程序知道他是个后台作业。于是将SIGTTIN信号送至该后台作业。

shell检測到其子进程的状态改变,并通知我们该作业已被停止。

然后。我们用shell的fg 将此停止的作业送入前台执行。

这样做能够使shell将此作业置入前台进程组。并将继续信号送给进程组。

由于该作业如今位于前台进程组中。所以它能够读控制终端。

[email protected]:~$ cat temp.foo & 在后台运行

[1] 4125

[email protected]:~$hello,world

[1]+  Done                    cat temp.foo

[email protected]:~$stty tostop

[email protected]:~$cat temp.foo &

[1] 4129

[email protected]:~$

键入回车,发现作业已经停止

[1]+  Stopped                 cat temp.foo

[email protected]:~$ fg %1   在前台恢复停止的作业

cat temp.foo                                         shell告诉我们如今哪一个作业在前台

hello,world                                       这是改作业的输出

总结:在shell命令后面加&,表示该命令将在后台启动。fg命令能够将后台作为送至前台。

stty tostop能够禁止后台作业输出到终端。

shell运行程序

shell是怎样运行程序、以及这与进程组、控制终端和会话等概念的关系.

shell将前台进程进程放在它自己的进程组中。shell则留在他自己的进程组中。

ps -o pid,ppid,pgrp,session,tpgid,comm

PID                   PPID                   PGRP      SESS        TPGID     COMMAND

4302       4293         4302      4302        4359         bash

4359       4302         4359      4302        4359         ps

shell将前台作业(ps)放入它自己的进程组(4359)中。ps命令是组长进程,并是该进程组中唯一的进程。

进一步讲,此进程组具有控制终端。所以它是前台进程组。我们的登录shell在运行ps命令时是后台进程。但须要注意的是。这两个进程组4302和43509都是同一会话的成员。

在后台运行此进程:

ps -o pid,ppid,pgrp,session,tpgid,comm &

PID                     PPID       PGRP    SESS        TPGID   COMMAND

4302         4293     4302       4302      4302       bash

4390        4302       4390     4302       4302       ps

再一次。ps命令被放入自己的进程组中,可是此时进程组(4302)不再是前台进程组,而是一个后台进程组。

登录的shell是前台进程组。

按下列方式在一个管道中运行两个进程:

ps -opid,ppid,pgrp,session,tpgid,comm | cat

PID    PPID  PGRP  SESS    TPGID    COMMAND

4302  4293 4302  4302  4411         bash

4411  4302 4411  4302  4411         ps

4412  4302 4411  4302  4411        cat

两个进程ps和cat1都在一个新进程组中(4411),这是一个前台进程。shell创建将运行管道线中的进程,也就是说ps和cat的父进程都是shell。

当在后台运行此管道线时。其结果类似。

ps -opid,ppid,pgrp,session,tpgid,comm | cat &

PID  PPID PGRP  SESS TPGID COMMAND

4302 4293  4302  4302 4302 bash

4440 4302  4440  4302 4302 ps

4441 4302  4440  4302 4302 cat

这里须要注意。使用不同的shell,那么它创建的各个进程的顺序是不同样的。以上讨论都是基于Linux上具有作业控制的shell为例。

假设linux上没有作用控制的shell,那么管道线中最后一个进程是shell的子进程。而运行管道中其它命令的进程则是该最后一个进程的子进程。

孤儿进程组

一个其父进程已终止的进程称为孤儿进程,这样的进程由init进程收养。整个进程组也能够称为孤儿。

孤儿进程组的定义:一个进程组不是孤儿进程组的条件是,该组中每一个成员的父进程要么是该组的一个成员,要么不是改组所属会话的成员。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-26 08:37:35

Linux/UNIX流程关系的相关文章

面向 Java 开发与测试人员的远程执行 Linux/UNIX 系统上任务的框架 -- sshxcu

软件开发与测试人员常常会在远程 Linux/UNIX 系统上执行命令或脚本,有时还会有批量执行任务的需求.常见的办法是通过本地工具(例如 Putty)连接远程计算机,输入命令执行,但是当遇到需要集成这些任务到代码或者开发.测试框架中时,往往就没有很好的解决方案了.sshxcute 就是这样一个框架工具集,它基于 JSCH 构建,允许工程师利用 Java 代码通过 SSH 连接远程批量执行 Linux/UNIX 系统上的命令或者脚本,同时加入了判断成功与否,取回输出等多种实用功能.sshxcute

linux引导流程

本章重点: 1.linux引导流程 2.linux运行级别 3.linux启动服务管理 4.GRUB配置与应用 5.启动故障分析解决 linux启动流程 1.固件(fireware):固话在硬件上的程序,主要有CMOS/BIOS 2.post加电自检, 1.检测硬件信息,如cpu,内存,等硬件信息是否工作正常. 2.安全设置 3.可引导介质列表 4.可引导介质的搜索程序 5.电源管理 6.启动细节信息 3.读取MBR(master boot record)主引导记录 MBR位于0柱头0磁头1扇区

《Linux/Unix系统编程手册》读书笔记9(文件属性)

<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有更深入的研究一定会写出来. 下图为磁盘分区与文件系统的关系 文件系统中的文件(目录)在i-node表上都有唯一的记录(i-node).i-node通过数据块指针指向数据块,这些数据块就是该i-node对应的文件的数据. i-node与数据块的关系如下: 因为Linux支持很多类型的文件系统,但是每种文件系统的

linux中断流程详解

异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核搭建了一个非常容易扩充的中断处理体系. 中 断系统结构涉及的方面很多,而且分布在很多的函数中,这里我主要理清一些结构和流程顺序已经在哪些函数中实现,我不知道其他人怎么样?但是我自己一开始怎 是找不到linux内核是怎么把GPIO设置成中断的,我找了很久都找不到,还有我们很多的设置,初始化等等东西好像

Linux系统启动流程、内核及模块管理

Linux系统启动流程.内核及模块管理 Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)内核(kernel): 进程管理(创建.调度.销毁等).内存管理.网络管理(网络协议栈).驱动程序.文件系统.安全功能IPC:Inter Process Communication机制本地进程间通信机制:消息队列.semerphor.shm(共享内存)跨主机进程间通信机制:socket等运行中的系统环境可分为两层:内核空间.用户空间内核空间(模式):内核代码(特权级操作-->系统调

Linux引导流程(第二版)

Linux引导流程 固件 按下电源的第一个启动步骤:启动固件firmware → POST加电自检 检查硬件的加载情况,如,键盘,内存等. 跟操作系统无关.但不同的硬件平台,固件不同; 当你新添加了一块硬盘,第一步就是应该首先进入到固件模式,检测固件是否已经识别出这块硬盘! 固件最重要的作用,读取MBR -> ... 自举程序 读取MBR[master boot record,主引导记录] [MBR位于位于磁盘的0柱面,0磁头,1扇区 如图:] 进入这一步骤的目的是读取MBR中的数据[MBR保存

linux/unix 段错误捕获【续】

本文为“在C/C++中捕获段错误,打印出错的具体位置”的续篇,进一步解决涉及动态链接库的情况. 背景知识: ·linux/unix下动态链接库的基本原理 ·/proc/pid/maps文件的基本格式 ·动态链接库:在进程执行过程中动态加载,进程间可以共享代码,可用在发布升级包等场合 概述: 用户自己编写的代码均编译进了可执行文件里的时候,“在C/C++中捕获段错误,打印出错的具体位置”里给出了在发生段错误(或其他错误,读者可以修改附件里面的头文件,增加捕获的错误类型)的情况下,输出代码执行路径的

转:linux/unix命令行终端的光标及字符控制快捷键

from:http://linux.chinaunix.net/techdoc/system/2007/11/23/973027.shtml 在使用linux/unix的命令行终端时,有时候会碰到键盘的退格键.删除键.Home键.方向键等不听使唤的现象:     按Backspace键,可能冒出来个^?     按Delete键,却出来个^[[3~     按Home键,却出来个^[[1~     按向左箭头键,却出来个^[[D     ……    以下是在大多数shell终端都可以使用的快捷键

Linux/UNIX高级I/O

高级I/O 非阻塞IO 非阻塞I/O使我们可以调用open.read和write这样的I/O操作,并使这些操作不会永久阻塞.如果这种操作不能完成,则调用立即出错返回,表示该操作如继续执行将阻塞. 对于一个给定的描述符有两种方法对其指定非阻塞I/O: 1)      如果调用open获得描述符,则可指定O_NONBLOCK标志 2)      对于已打开的一个描述符,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志. 记录锁 记录锁的功能是:当一个进程正在读或修改文件的某个部分时,