画了一个晚上写出来,废话多说,直接上代码
/*
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建一个匿名管道,用来进程间通信。
参数:int pipefd[2] 这个数组是一个传出参数。
pipefd[0] 对应的是管道的读端
pipefd[1] 对应的是管道的写端
返回值:
成功 0
失败 -1
管道默认是阻塞的:如果管道中没有数据,read阻塞,如果管道满了,write阻塞
注意:匿名管道只能用于具有关系的进程之间的通信(父子进程,兄弟进程)
*/
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
//1.创建管道
int pipefd[2];
int ret= pipe(pipefd); //<unistd.h>
if(ret==-1){ //管道创建失败打印失败原因退出程序
perror("pipe"); //<stdio.h>
exit(0);//#include <stdlib.h>
}
//2.创建子进程
pid_t pid = fork(); //<unistd.h>
if(pid==-1){ //子进程创建失败打印失败原因退出程序
perror("fork");
exit(0);
}
if(pid>0){ //如果是父进程返回值就是子进程id
//3.在父进程收数据
close(pipefd[1]); //关闭写端
printf("我是父进程:%d\n",getpid());
char buf[1024]={0};
while(1){
int len=read(pipefd[0],buf,sizeof(buf));
printf("老爸收到的内容:%s, 老爸的pid:%d\n",buf,getpid());
//sleep(1);
}
}else if(pid==0){//如果是子进程返回值就是0
//4.在子进程发数据
close(pipefd[0]); //关闭读端<unistd.h>
printf("我是子进程:%d\n ",getpid());
for(int i=0;i<100;i++){
char str[1024]={0};
sprintf(str,"我是你儿子 长江%d号",i);
write(pipefd[1],str,strlen(str));
sleep(1);
}
// int i=0;
// while(1){
// i++;
// char str[1024]={0};
// sprintf(str,"我是你儿子 长江%d号",i);
// write(pipefd[1],str,strlen(str));
// sleep(1);
// }
// while(1) {
// char * str = "hello,i am child";
// write(pipefd[1], str, strlen(str));
// printf("儿子发的的内容:%s, 儿子的pid:%d\n",str,getpid());
// sleep(1);
// }
}
return 0;
}