进程间通信-管道-学习
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
void sys_err(const char* str){
perror(str);
exit(1);
}
//父进程创建管道,并通过管道给子进程发消息,子进程从管道读消息,并打印到屏幕
//pid=fork() fork出子进程,该语句前面的变量、属性会(克隆)一份给子进程 //目前的理解及猜测
//管道创建发生在这之前,所以父子进程可以通过管道通信
int main(){
char buf[1024];
char *p="test for pipe \n";
//main主进程创建一个管道
int fd[2];
if(pipe(fd) == -1){ //成功返回0
sys_err("pipe create failed!");
return -1;
}
pid_t pid; //==0
pid=fork(); //main进程fork出子进程 成功返回子进程号(>0),失败返回负数
//此时开始main进程和子进程并行运行
//main(父)进程变量pid为fork()的返回值也即子进程号
//main进程和子进程分别各自执行自己的下面代码段
//main进程和子进程分开执行
//pid这个变量属于main进程
if(pid < 0){
sys_err("fork error!");
return pid;
}else{ //pid >= 0
if(pid==0){ //子进程走这里
close(fd[1]);
int len=read(fd[0],buf,sizeof(buf));
write(STDOUT_FILENO,buf,len); //打印屏幕
close(fd[0]);
}else{ //父进程main走这里
close(fd[0]);
write(fd[1],p,strlen(p));
wait(NULL);
close(fd[1]);
}
}
return 0;
}