管道上有多次读写

时间:2016-02-23 05:57:53

标签: c unix operating-system pipe

我不明白管道是如何工作的。对于以下程序。父进程两次写入管道,子进程从管道读取两次,但在第二次读取时,看起来child只读取一个字符。该 该计划的输出是:

  

[2297]:我的bufin是{empty},我的bufout是{hello}

     

[2298]:我的bufin是{a},我的bufout是{hello}

为什么子进程的bufin是a而不是// aaa。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFSIZE 10

int main( void ) {
   char bufin[ BUFSIZE ] = "empty";
   char bufout[] = "hello";
   char b[] = "//aaa";
   int bytesin;
   pid_t childpid;
   int fd[ 2 ];
   if ( pipe( fd ) == -1 ) {
      perror( "Failed to create the pipe" );
      return 1;
   }
   bytesin = strlen( bufin );
   childpid = fork();
   if ( childpid == -1 ) {
      perror( "Failed to fork" );
      return 1; 
   }
   if ( childpid ) {      /* parent code */
      // Parent node write to the pipe.       
      write( fd[ 1 ], bufout, strlen( bufout ) + 1 );
      write( fd[ 1 ], b, strlen(b) + 1 ); // Just for trying
   }
   else {                 /* child code */
      bytesin = read( fd[ 0 ], bufin, BUFSIZE );
      bytesin = read( fd[ 0 ], bufin, BUFSIZE );  // Just for trying  
   }    
   fprintf(stderr, "[%ld]:my bufin is {%.*s}, my bufout is {%s}\n",
           (long)getpid(), bytesin, bufin, bufout);
   return 0; 
}

1 个答案:

答案 0 :(得分:2)

在第一次阅读时,你要求BUFSIZE字节,所以read得到'hello \ 0 // aa'(正好10个字符)。当你打印这个时,你只看到'hello',因为之后有NULL字符。只读左字符是一个'a'字母,您在第二次阅读后会看到。你也忘记了在父母和孩子中关闭未使用的管道末端。请参阅非常好的管道指南:http://beej.us/guide/bgipc/output/html/multipage/pipes.html