进程间通信——管道
最早的UNIX IPC方式
使用是最简单的,局限也是最大的
管道是半双工的
两端进程必须是父子关系或者有共同祖先
使用方式:
一个进程使用系统调用pipe(int fd[2])创建管道,fd[0]为读端、fd[1]为管道的写端
接下来,调用fork调用创建一个新的子进程。
父子进程共享文件描述符,因此,fd也可以被子进程使用。
这种使用会带来问题:同时进行读写,最终谁读到数据由进程调度决定。
因此,为了达到数据通信的目的,在子进程写的时候,关闭父进程的写描述符、关闭子进程的读描述符,形成一个单工的管道。
如果程序需要使用全双工的管道,则需要再创建一条管道。
man
对pipe的描述如下:
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
/* On Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64; see NOTES */
struct fd_pair {
long fd[2];
};
struct fd_pair pipe();
/* On all other architectures */
int pipe(int pipefd[2]);
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
/* On Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64; see NOTES */
struct fd_pair {
long fd[2];
};
struct fd_pair pipe();
/* On all other architectures */
int pipe(int pipefd[2]);
一个简单的使用例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>