LINUX进程间通信程序设计——管道通信
什么是管道?
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。
数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。
管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
无名管道由pipe()函数创建:
int pipe(int filedis[2]);
当一个管道建立时,它会创建两个文件描述符:
filedis[0]用于读管道,filedis[1]用于写管道。
管道关闭
关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭。
管道读写
管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程锁创建的管道
必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符。
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <errno.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 int main(int argc, char **argv)
10 {
11 int pipe_fd[2];
12 pid_t pid;
13 int r_num;
14 char buf_r[100];
15
16 memset(buf_r, 0, sizeof(buf_r));
17
18 if(pipe(pipe_fd) < 0)
19 {
20 perror("pipe");
21 exit(1);
22 }
23
24 if((pid = fork()) < 0)
25 {
26 perror("fork");
27 exit(1);
28 }
29 else if(pid ==