管道通信之无名管道---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 512
    12 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 write
    26       //一个约定,父子进程都需遵守
    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 read
    37         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         

     

  • 父子进程通过管道,进行多次读写操作,先贴上一个比较奇葩的方法(就是一个错误):

     1 /*============================================
     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 1024
    12 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 read
    27             close(fds[1]);//1 write
    28             char buf[1024] = "";
    29             read(fds[0],buf,1024);//只能有一个读,
    30             printf("child read:%s\n",buf);
    31             //exit(1);
    32         }else{//parent write
    33 
    34             close(fds[0]);//0 read
    35             //        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 }
    View Code

    再贴上正确的方法:

     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 512
    12 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 read
    25             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 }

     

posted @ 2014-08-22 02:22  donald_su  阅读(562)  评论(0编辑  收藏  举报