首页 > 代码库 > 管道通信之无名管道---pipe()
管道通信之无名管道---pipe()
pipe()函数在子进程产生之前就应该存在。
- 父子进程之间只进行一次传递
1 /*============================================ 2 > Copyright (C) 2014 All rights reserved. 3 > FileName:onepipe.c 4 > author:donald 5 > details: 6 ==============================================*/ 7 #include <unistd.h> 8 #include <stdio.h> 9 #include <stdlib.h>10 #include <string.h>11 #define N 51212 int main(int argc, const char *argv[])13 {14 int pipefd[2];15 pid_t pid;16 17 if(pipe(pipefd) == -1){18 perror("pipe failed");19 exit(-1);20 }21 printf("%u\n",pid);22 pid == fork();//这里一个个大大的bug,自己的误操作,debug了很久才搞定了23 printf("%u\n",pid);24 if(0 == pid){25 close(pipefd[1]);//0 read 1 write26 //一个约定,父子进程都需遵守27 28 char buf[N];29 memset(buf,0,N);30 read(pipefd[0],buf,N);31 printf("child read:%s\n",buf);32 33 printf("child exit\n");34 exit(1);35 }else{36 close(pipefd[0]);//0 read37 char line[N];38 printf("parent begin\n");39 40 memset(line,0,N);41 fgets(line,N,stdin);42 43 write(pipefd[1],line,strlen(line));44 printf("parent exit\n");45 wait(NULL);//等待子进程的结束46 }47 return 0;48 }49
父子进程通过管道,进行多次读写操作,先贴上一个比较奇葩的方法(就是一个错误):
View Code1 /*============================================ 2 > Copyright (C) 2014 All rights reserved. 3 > FileName:my_pipe.c 4 > author:donald 5 > details: 6 ==============================================*/ 7 #include <unistd.h> 8 #include <stdio.h> 9 #include <stdlib.h>10 #include <string.h>11 #define N 102412 int main(int argc, const char *argv[])13 {14 int fds[2];15 if(pipe(fds) == -1){//只能有一对进行读写16 perror("failed");17 exit(1);18 }19 pid_t pid = fork();20 if(pid == -1){21 perror("error");22 exit(1);23 }24 25 while(1){26 if(pid == 0){//child read27 close(fds[1]);//1 write28 char buf[1024] = "";29 read(fds[0],buf,1024);//只能有一个读,30 printf("child read:%s\n",buf);31 //exit(1);32 }else{//parent write33 34 close(fds[0]);//0 read35 // char *p = "hello,donald";36 char line[N];37 // memset(line,0,N);38 fgets(line,N,stdin);39 write(fds[1],line,strlen(line));40 //wait(NULL);41 }42 }43 return 0;44 }
再贴上正确的方法:
1 /*============================================ 2 > Copyright (C) 2014 All rights reserved. 3 > FileName:twopipe.c 4 > author:donald 5 > details: 6 ==============================================*/ 7 #include <unistd.h> 8 #include <stdio.h> 9 #include <stdlib.h>10 #include <string.h>11 #define N 51212 int main(int argc, const char *argv[])13 {14 int pipefd[2];15 pid_t pid;16 //pid = fork();17 18 if(pipe(pipefd) == -1){19 perror("pipe failed");20 exit(-1);21 }22 pid = fork();23 if(pid == 0){24 close(pipefd[1]);//0 read25 char buf[N];26 while(1){27 memset(buf,0,N);28 if(read(pipefd[0],buf,N) == 0){29 break;30 }31 printf("child read:%s\n",buf);32 }33 printf("child exit\n");34 exit(1);35 }else{36 close(pipefd[0]);37 char line[N];38 while(memset(line,0,N),fgets(line,N,stdin) != NULL ){39 write(pipefd[1],line,strlen(line));40 }41 close(pipefd[1]);42 printf("parent exit\n");43 wait(NULL);44 }45 return 0;46 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。