(九)无名管道通信
1.核心理论-通讯
通讯目的
1、数据传输
一个进程需要将数据发送给另一个进程。
2、资源共享
多个进程之间共享同样的资源。
3、通知事件
一个进程需要向另一个/组进程发送消息,通知它们发生了某事件。
4、进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),此时 控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它 的状态改变。
通讯发展
Linux进程间通信(IPC:interprocess communication) 由以下几部分发展而来:
1、UNIX进程间通信
2、基于System V进程间通信
3、POSIX进程间通信
通讯方式
Linux进程间通讯的主要方式有
1、无名管道(pipe)
2、有名管道(FIFO)
3、信号(signal)
4、消息队列
5、共享内存
6、信号量
7、套接字
管道通信
一个进程在管道的尾部写入数据,另一个进程从管道的头部 读出数据。
管道包括无名管道和有名管道两种,
前者只能用 于父进程和子进程间的通信,后者可用于运行于同一系统中 的任意两个进程间的通信
管道通信 -特点
1.管道通讯是单向的,有固定的读端和写端。
2. 数据被进程从管道读出后,在管道中该数据就不存在了。
3. 当进程去读取空管道的时候,进程会阻塞。
4. 当进程往满管道写入数据时,进程会阻塞。
5. 管道容量为64KB(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h
无名管道
在Linux系统中,无名管道一旦创建完成后,操作无名管道 等同于操作文件。无名管道的读端被视作一个文件;无名管 道的写端也被视作一个文件。
2.函数学习-无名管道
创建管道 pipe
函数原形:
int pipe(int pipefd[2]);
函数功能:
创建无名管道
所属头文件:
<unistd.h>
返回值:
成功 0 失败 -1
参数说明:
pipefd[0]: 读端fd pipefd[1]: 写端fd
综合示例
#include <stdio.h> #include <unistd.h> int main() { int p[2]; char buf[128] = {0}; int ret = -1; pipe(p); pid_t pid = fork(); if (pid < 0) { perror("fork error"); return -1; } if (pid==0) { // 子进程 sleep(1); close(p[0]); // 关闭子进程的读端 write(p[1], "hello world!", 12); } else { // 父进程 close(p[1]); // 关闭父进程的写端 ret = read(p[0], buf, sizeof(buf)); printf("ret=%d buf=%s\n", ret, buf); } return 0; }