管道通讯是一种简单粗暴的进程间通讯,不言而喻有几个缺点:首先是数据自己读但不能写,二是数据一旦自己读取,就不在管道中存在,不能再次读取,三是由于采用半双工通讯方式,数据只能一个方向流动,四是只有在公共祖先的进程间使用管道。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
void sys_perror(const char *str){
perror(str);
exit(1);
}
int main(){
char *str = "hello pipe!\n";
char buf[1024];
int fd[2];
pid_t pid;
int ret;
ret = pipe(fd);
if(ret == -1)
sys_perror("pipe error");
pid = fork();
if(pid < 0){
sys_perror("fork error");
}else if(pid > 0){ //父进程向管道写数据
close(fd[0]); //关闭进程读端
sleep(2);
write(fd[1],str,strlen(str)); //向管道写入数据
wait(NULL); //等待子进程
close(fd[1]); // 关闭管道写端
}else if(pid == 0){ //子进程向管道读数据
close(fd[1]); //关闭管道写端
ret = read(fd[0],buf,sizeof(buf)); //读取数据
write(STDOUT_FILENO,buf,ret); //打印到控制台
close(fd[0]); //关闭读端
}
return 0;
}