进程组与会话

353 阅读4分钟

1. 进程组

进程组,也叫做作业。BSD于1980年前后向Unix中增加的一个新特性,代表一个或者多个进程的集合,每个进程都属于一个进程组。操作系统设计进程组的概念主要就是为了简化对多个进程的管理。

当父进程创建子进程的时候,默认父进程和子进程同属于同一个进程组,进程组的ID等于第一个进程的ID,也就是组长进程的ID。我们在使用kill杀死进程的时候,可以通过 kill -SIGKILL -进程组ID 来杀死整个进程组内的全部进程。组长进程可以创建一个进程组,只要进程组中有一个进程存在,那么这个进程组就存在,并且即使组长进程终止也不会影响进程组。进程组的生命周期时从进程组创建到进程组最后一个进程终止或转移到另一个进程组。而进程可以为自己或者子进程设置进程组ID。

2. 会话

创建会话的注意事项:

  • 调用进程不能是进程组组长(父进程不能创建会话),该进程变成新会话首进程session header;
  • 该进程成为一个新的进程组的组长进程,也就是说如果子进程创建了一个会话,那么子进程就脱离父进程的进程组,成为一个新进程的进程组组长;
  • 新会话丢弃原有的控制终端,该会话没有控制终端;
  • 该调用进程是组长进程,则出错返回,也就是说组长不能当会长;
  • 建立新会话时,先调用fork,父进程会终止,子进程调用setsid,也就是说,只有父进程终止了,子进程才能创建会话;

3. 总结

进程组:多个进程在同一个组,第一个进程默认是进程组组长。

会话:进程组的上一级,多个进程组对应一个会话。

创建会话的时候,不能使用进程组组长创建,必须使用组员创建。

创建会话主要包括创建子进程、结束父进程、子进程做会长三步。

4. setsid()和getsid()函数

4.1 setsid()函数

  • 包含头文件及函数原型
#include <unistd.h>

pid_t setsid(void);
  • 函数描述

    setsid() creates a new session if the calling process is not a process group leader. The calling process is the leader of the new session, the process group leader of the new process group, and has no controlling tty. The process group ID and session ID of the calling process are set to the PID of the calling process. The calling process will be the only process in this new process group and in this new session.

  • 函数参数

    void

  • 函数返回值

    On success, the (new) session ID of the calling process is returned. On error, (pid_t) -1 is returned, and errno is set to indicate the error.

4.2 getsid()函数

  • 包含头文件及函数原型
#include <unistd.h>

pid_t getsid(pid_t pid);
  • 函数描述

    getsid(0) returns the session ID of the calling process. getsid§ returns the session ID of the process with process ID p. (The session ID of a process is the process group ID of the session leader.)

  • 函数参数

    pid

  • 函数返回值

    On success, a session ID is returned. On error, (pid_t) -1 will be returned, and errno is set appropriately.

IPC

Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。

在前面我们分析过进程的虚拟地址空间结构图,实际上进程的0-3G用户区是相对独立,进程之间要想通信,是通过内核提供的一块缓冲区实现的,而IPC就是进程间通过内核提供的缓冲区进行数据交换的机制。

在这里插入图片描述

在进程间完成数据传递需要借助操作系统提供特殊的方法,比如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的发展,一些方法由于自身设计缺陷被淘汰或者弃用。现今常用的进程间通信方式有:

  • 管道 (使用最简单)

    • pipe:管道(无名),只支持有血缘关系的进程通信(fork创建的)。
    • fifo:有名管道,无血缘关系的进程间也可通信。
  • mmap,文件映射共享IO,速度最快,因为它实际上是在内存中开辟一块缓冲区,然后把文件映射到这块缓冲区中,这样直接操作内存就可以了。

  • 本地socket,即本地套接字 ,是最稳定通信方式。

  • 信号 ,开销最小,携带信息量最小。

  • 共享内存

  • 消息队列