1,引入
管道是进程间通信(IPC)的最常用的用法,但是它有两个限制:
- 管道只能在具有公共祖先的两个进程之前使用,通常是在父进程和子进程之间;
- 管道通常都是半双工的,即要么父进程写子进程读;要么子进程写父进程读;
函数原型如下:
#include<unistd.h>
int pipe(int fd[2]);
输入参数是创建管道成功后,输入端(fd[0])与输出端(fd[1])的文件描述符。
管道是用于进程间的通信的。在两个进程里都能看到fd[0]与fd[1]。
- 如果父进程写,子进程读:
- 父进程关闭fd[0],通过fd[1]向管道写内容;
- 子进程关闭fd[1],通过fd[0]读取父进程写入管道的内容
- 如果子进程写,父进程读:
- 子进程关闭fd[0],通过fd[1]向管道写内容;
- 父进程关闭fd[1],通过fd[0]读取子进程写入管道的内容
2,例子
实现一个典型的,父进程到子进程的例子
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
//15.2 管道
int n;
int fd[2];
pid_t pid;
char line[100];
//创建管道
if (pipe(fd) < 0) {
printf("pipe error !\n");
exit(1);
}
//创建子进程
if ((pid = fork()) < 0){
printf("fork error !\n");
exit(1);
} else if (pid > 0) {
//父进程,
close(fd[0]); //关闭管道的读端
write(fd[1], "hello world\n", 12); //向管道写入内容
} else {
//子进程,
close(fd[1]); //关闭管道的写端
n = read(fd[0], line, 100); //从管道里读取内容
printf("%s",line);
}
exit(0);
}
这里父进程通过管道告诉了子进程一句“Hello World”。
输出结果如下:
➜ code g++ -g -W -o study_Linux study_Linux.c -lpthread
➜ code ./study_Linux
hello world