如何将更多值写入管道并读取它们?

时间:2011-07-20 16:29:29

标签: c++ linux process pipe

我在linux下用c ++编写一个程序,其中子进程应该将两个long值写入管道,父进程应该读取它们。到现在为止,我onlz设法为此设置两个(命名)管道,并通过写入(fd1,& value1,sizeof(long))写入每个管道并通过读取读取(fd1,& value1,sizeof(long)) )。 两个管道只有一个管道会更好但我无法弄清楚如何做到这一点。

我试过了:

write(fd1,&value1,sizeof(long));

write(fd1,&value2,sizeof(long));

还有两个读取,但这似乎导致进程阻塞并等待彼此。

如果有人能给我一个暗示,如何实现这一点,我会很高兴。

可能的解决方案:我在数组中写了所有值(因为我知道有多少),然后我只需要一个有线/读取调用。

2 个答案:

答案 0 :(得分:3)

应该可以正常工作。这是一个非常简单的例子。它主要是代码from the example in the man page的副本。

int main(int argc, char *argv[])
{
   int fd[2];
   pid_t cpid;
   int ret;
   int val = 0;
   if (pipe(fd) == -1)
      {
      perror("pipe"); exit(EXIT_FAILURE);
      }
   cpid = fork();
   if (cpid == -1)
      {
      perror("fork"); exit(EXIT_FAILURE);
      }
   if (cpid == 0) { 
      // close write end of pipe in child
      close(fd[1]);   
      ret = read(fd[0], &val, sizeof( val ));
      printf( "1: result = %d, value = %d\n", ret, val );
      ret = read(fd[0], &val, sizeof( val ));
      printf( "2: result = %d, value = %d\n", ret, val );
      close(fd[0]);
      _exit(EXIT_SUCCESS);
      } 
   else {
      // close read end of pipe in parent
      close(fd[0]); 
      val = 42;
      if ( write(fd[1], &val, sizeof(val)) < 0 )
         perror( "write" );
      val++;
      if ( write(fd[1], &val, sizeof(val)) < 0 )
         perror( "write" );
      close(fd[1]); 
      wait(NULL); 
      exit(EXIT_SUCCESS);
      }
}

答案 1 :(得分:1)

您应该检查read()的返回值,最终(并且可能)将两个long一起发送到接收进程。在这种情况下,您需要将接收的缓冲区拆分为两个长整数。