作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。
1. 进程组 (process group)
每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID (PID见Linux进程基础)成为进程组的ID (process group ID,
PGID),以识别进程组。
$ps -o pid,pgid,ppid,comm | cat
PID PGID PPID COMMAND
17763 17763 17751 bash
18534 18534 17763 ps
18535 18534 17763 cat
PID为进程自身的ID,PGID为进程所在的进程组的ID, PPID为进程的父进程ID。从上面的结果,我们可以推测出如下关系:
图中箭头表示父进程通过fork和exec机制产生子进程。ps和cat都是bash的子进程。进程组的领导进程的PID成为进程组ID。领导进程可以先终结。此时进程组依然存在,并持有相同的PGID,直到进程组中最后一个进程终结。
我们将一些进程归为进程组的一个重要原因是我们可以将信号发送给一个进程组。进程组中的所有进程都会收到该信号。我们会在下一部分深入讨论这一点。
2. 会话 (session)
更进一步,在shell支持工作控制(job control)的前提下,多个进程组还可以构成一个会话 (session)。bash(Bourne-Again shell)支持工作控制,而sh(Bourne shell)并不支持。
会话是由其中的进程建立的,该进程叫做会话的领导进程(session leader)。会话领导进程的PID成为识别会话的SID(session ID)。会话中的每个进程组称为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground),而其他的进程组是后台工作(background)。每个会话可以连接一个控制终端(control
terminal)。当控制终端有输入输出时,都传递给该会话的前台进程组。由终端产生的信号,比如CTRL+Z, CTRL+\,会传递到前台进程组。
会话的意义在于将多个工作囊括在一个终端,并取其中的一个工作作为前台,来直接接收该终端的输入输出以及终端信号。 其他工作在后台运行。
一个命令可以通过在末尾加上&方式让它在后台运行:
$ping localhost > log &
此时终端显示:
[1] 10141
括号中的1表示工作号,而10141为PGID
我们通过如下方式查询更加详细的信息:
$ps -o pid,pgid,ppid,sid,tty,comm
(tty表示控制终端)
信号可以通过kill
$kill -SIGTERM -10141
或者
$kill -SIGTERM %1
的方式来发送给工作组。上面的两个命令,一个是发送给PGID(通过在PGID前面加-来表示是一个PGID而不是PID),一个是发送给工作1(%1),两者等价。
一个工作可以通过$fg从后台工作变为前台工作:
$cat > log &
$fg %1
当我们运行第一个命令后,由于工作在后台,我们无法对命令进行输入,直到我们将工作带入前台,才能向cat命令输入。在输入完成后,按下CTRL+D来通知shell输入结束。
进程组(工作)的概念较为简单易懂。而会话主要是针对一个终端建立的。当我们打开多个终端窗口时,实际上就创建了多个终端会话。每个会话都会有自己的前台工作和后台工作。这样,我们就为进程增加了管理和运行的层次。在没有图形化界面的时代,会话允许用户通过shell进行多层次的进程发起和管理。比如说,我可以通过shell发起多个后台工作,而此时标准输入输出并不被占据,我依然可以继续其它的工作。如今,图形化界面可以帮助我们解决这一需求,但工作组和会话机制依然在Linux的许多地方应用。
总结:
process group, pgid
session, sid, job, forground, background
fg, kill -pid, &, %
作者:Vamei出处:http://www.cnblogs.com/vamei欢迎转载,也请保留这段声明。谢谢!
分享到:
相关推荐
### Linux进程间通信与同步详解 #### 一、概述 在多任务操作系统中,进程间通信与同步机制是解决进程间数据交换与资源共享的关键技术。这些机制确保了多个并发运行的任务能够有效地协作,并且避免了资源冲突。对于...
父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。 2. 进程管理 Linux 进程管理是通过进程管理工具实现的,如 ps、kill、pgrep 等工具。 2.1 ...
本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...
匿名管道仅适用于父子进程或兄弟进程间的通信,而命名管道可以在不具有亲缘关系的进程间使用,通过文件系统中的一个特殊文件来标识。 4. **示例代码分析**:Demo程序可能包含了创建信号量、共享内存和FIFO管道的...
【Linux进程间通信】是操作系统中进程协作的重要方式,它允许不同的进程共享数据和资源,协同完成任务。在Linux系统中,进程间通信(IPC,Inter-Process Communication)包括多种技术,如管道、信号、信号量、共享...
### Linux进程间通信详解 #### 引言 在现代操作系统如Linux中,进程间通信(IPC,Inter-Process Communication)是实现多进程协同工作的重要机制。通过IPC,不同进程能够共享信息、同步状态以及协作完成复杂的任务...
【进程控制实验】是Linux操作系统课程中的一个重要环节,旨在帮助学生深入理解进程的概念以及进程间的交互。通过实验,学生能够掌握以下关键知识点: 1. **进程的概念与程序的区别**: 进程是操作系统资源分配的...
《Linux进程结构及组织方式研究》这篇文献主要探讨了Linux操作系统中进程的结构和组织方式,对于理解Linux内核的工作原理和源码分析具有重要意义。Linux进程作为操作系统的核心组成部分,其结构和组织方式直接影响到...
* Linux 系统的所有进程间的关系呈现树型结构,除 1 号进程(init)外,其他每个进程都是由另一个进程创建的,在树结构中以父子关系存在。 * 1 号进程是整个树型结构的树根,是任何其他进程的祖先。 * Linux 进程在...
6. **进程关系**:每个进程都有一个父进程,可以通过`ppid`(parent process ID)来追踪。孤儿进程(其父进程已退出)会被init进程收养。守护进程(daemon)通常在后台运行,不与终端关联,用于提供持续服务。 7. *...
Linux进程间通信是操作系统中进程协调工作的重要机制。在Linux环境下,进程可以通过多种方式交换信息,其中管道(Pipe)是一种简单而古老的方式。管道是一种半双工的通信方式,意味着数据只能在一个方向上流动,若要...
### Linux 进程间通信详解 #### 一、管道及有名管道 在深入探讨Linux中的进程间通信(IPC)机制之前,我们先了解一个基本概念:**进程**。进程是程序执行的一个实例,每个进程都有自己的地址空间。当多个进程需要...
在“ka.rar”这个压缩包中,包含了关于Linux进程调度、进程管理以及进程同步的相关实验和资料,这些都是理解和操作Linux系统至关重要的知识点。 首先,我们来看“进程调度”。在Linux中,进程调度器负责决定哪个...
总的来说,理解Linux进程的地址空间对于系统管理员和开发者来说至关重要,因为它关系到程序的性能、内存使用效率和稳定性。通过实验和分析,我们可以更好地诊断和解决与内存相关的问题,优化程序的内存管理,提高...
本主题将深入探讨如何使用互斥锁、条件变量以及共享内存这三种机制来实现无亲缘关系间进程的同步通信。 1. **互斥锁(Mutex)**: 互斥锁是一种基本的同步原语,用于保护共享资源。当一个进程获取了互斥锁后,其他...
本文将深入解析Linux进程间通信机制,通过源代码分析和流程图来帮助理解各种IPC方法。 首先,我们要理解进程的概念。在Linux系统中,进程是程序的一次执行实例,每个进程都有自己的内存空间,相互独立。为了实现...
- **进程间的族亲关系** - **进程间的链接信息** - **进程调度信息** - **进程的时间信息** - **进程的虚存信息** - **进程的文件信息** - **与进程间通信有关的信息** - **其他信息** #### 进程状态 - **...
管道可以是匿名管道或命名管道,匿名管道只能用于具有亲缘关系的进程之间的通信,而命名管道可以用于任何进程之间的通信。 2. 信号(Signal):信号是 Linux 中的一种异步通信机制,它允许一个进程发送信号给另一个...
`pstree`命令可以直接以树状形式显示进程关系,非常直观。默认情况下,它会显示所有进程,但你可以通过传递参数来指定特定的进程,如`pstree 1234`。 此外,`pgrep`和`pids`命令虽然不直接打印进程树,但在查找特定...