一、有名管道
有名管道(Named Pipe)是一种进程间通信(IPC)机制,允许不同进程之间以一种特定的方式进行数据传输。与匿名管道不同,有名管道在创建时会被赋予一个名称,这使得不同的进程能够通过这个名称来访问管道。
二、有名管道的特点
-
定义: 有名管道是一个特殊的文件类型,它在文件系统中有一个名称,允许不同进程之间进行通信。
-
特性:
- 可以用于任意进程间的通信,不限于父子进程。
- 数据传输遵循先进先出(FIFO)的读写规则。
-
读写规则:
- 写入到管道中的数据会被按顺序读取。
- 如果没有进程读取数据,写入进程可能会被阻塞,反之亦然。
-
不支持定位操作:
- 管道中的数据不支持定位操作,例如
lseek
和fseek
,这意味着不能在管道中随机访问数据。
- 管道中的数据不支持定位操作,例如
-
特殊文件:
- 有名管道作为一种特殊文件,具有系统级的命名,可以在文件系统中查找到,并且符合前面的管道操作特点。
三、有名管道的相关函数
mkfifo
: 创建一个有名管道。
int mkfifo(const char *pathname, mode_t mode);
由于管道是一种特殊的文件,因此实际上对管道的操作就是对文件的操作
open、write等都可以使用。除了定位操作。
四、信号
信号是 用于进程间通信的一种机制,它允许进程相互通知事件的发生。信号通常用于告知进程某些异步事件,例如用户中断、定时器到期或其他进程的事件。
1. 信号的基本概念
- 信号的定义: 信号是一种软件中断,用于通知进程发生了某种事件。信号可以来自用户、内核或其他进程。
- 异步通信: 信号提供了一种异步的方式来处理事件,进程不需要一直轮询某个状态,而是通过接收信号来响应事件。
2. 信号的种类
- 常见信号:
SIGINT
:由 Ctrl+C 产生,用于中断进程。SIGKILL
:强制终止进程,无法被捕捉或忽略。SIGTERM
:请求终止进程,进程可以捕捉此信号进行清理操作。SIGSEGV
:非法访问内存,导致进程中止。SIGALRM
:定时器到期
3. 信号的处理
-
默认操作: 每个信号都有一个默认的操作,如终止进程或忽略信号。
SIG_IGN(忽略信号) SIG_DFL(默认操作)
-
自定义信号处理: 进程可以注册一个信号处理函数,以便在接收到某个信号时执行特定操作。可以使用
signal
函数或sigaction
函数来设置信号处理器。 -
#include <signal.h> void signal_handler(int signum) { printf("Received signal %d\n", signum); } int main() { signal(SIGINT, signal_handler); // 注册信号处理器 while (1) { // 进行某些操作 } return 0; }
4. 信号的发送和接收
-
发送信号: 可以使用
kill
命令或kill
函数(在程序中)向进程发送信号。 -
kill(pid, SIGTERM); // 向指定进程发送 SIGTERM 信号
-
进程组和会话: 信号可以向一个进程组或整个会话发送,进而影响多个进程。