c - 使用 While 循环在 C 中的管道之间发送数据

标签 c pipe

我试图在两个管道之间发送数据,这将从父->子->父->子等开始,直到我退出循环。现在我试图只传递一个整数并为每次读取增加它。目前,似乎每个进程只是在增加自己的值,并且它的读取组件无法正常工作。我的管道设置错误吗?

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

#define BUFFER_SIZE 25
#define READ  0
#define WRITE 1

int main(void)
{
  pid_t pid;
  //open two pipes, one for each direction
  int mypipefd[2];
  int mypipefd2[2];

  /* create the pipe */
  if (pipe(mypipefd) == -1 || pipe(mypipefd2) == -1) {
    fprintf(stderr,"Pipe failed");
    return 1;
  }

  /* now fork a child process */
  pid = fork();

  if (pid < 0) {
    fprintf(stderr, "Fork failed");
    return 1;
  }


  if (pid > 0) {  /* parent process */
    int parentVal = 0;
    while(1) {
      close(mypipefd[READ]);      //close read end, write and then close write end
      parentVal++;
      write(mypipefd[WRITE],&parentVal,sizeof(parentVal));
      printf("Parent: writes value : %d\n", parentVal);
      close(mypipefd[WRITE]);
      close(mypipefd2[WRITE]);        //close write end, read, and then close read end
      read(mypipefd2[READ],&parentVal,sizeof(parentVal));
      printf("Parent: reads value : %d\n", parentVal);
      close(mypipefd2[READ]);
    }
  }
  else { /* child process */
      int childVal = 0;
      while(1) {
      close(mypipefd[WRITE]);
      read(mypipefd[READ],&childVal,sizeof(childVal));
      printf("child: read value : %d\n", childVal);
      childVal++;
      close(mypipefd[READ]);
      close(mypipefd2[READ]);       //close read end, write and then close write end
      write(mypipefd2[WRITE],&childVal,sizeof(childVal));
      printf("child: write value : %d\n",childVal);
      close(mypipefd2[WRITE]);
    }
  }
}

最佳答案

除了 Jonathan Leffler 所说的,我想说你应该添加检查以确保何时 read失败,你优雅地处理这种情况。

  if (pid > 0) {  /* parent process */
      int parentVal = 0;
      close(mypipefd[READ]);      // The parent is not going to read from the first pipe.
                                  // Close the read end of the pipe.
      close(mypipefd2[WRITE]);    // The parent is not going to write to the second pipe.
                                  // Close the write end of the pipe.
      while(1) {
          parentVal++;
          write(mypipefd[WRITE],&parentVal,sizeof(parentVal));
          printf("Parent: writes value : %d\n", parentVal);

          // If the chld closes the write end of the second pipe,
          // break out of the loop.
          if ( read(mypipefd2[READ],&parentVal,sizeof(parentVal)) > 0 )
          {
             printf("Parent: reads value : %d\n", parentVal);
          }
          else
          {
             break;
          }
      }

      close(mypipefd[WRITE]);    // Close the write end of the first pipe
      close(mypipefd2[READ]);    // Close the read end of the second pipe
  }
  else { /* child process */
      int childVal = 0;
      close(mypipefd[WRITE]);    // The child is not going to write to the first pipe.
                                 // Close the write end of the pipe.
      close(mypipefd2[READ]);    // The child is not going to read from the second pipe.
                                 // Close the read end of the pipe.
      while(1) {

          // If the parent closes the write end of the first pipe,
          // break out of the loop.
          if ( read(mypipefd[READ],&childVal,sizeof(childVal)) > 0 )
          {
             printf("child: read value : %d\n", childVal);
          }
          else
          {
             break;
          }

          childVal++;
          write(mypipefd2[WRITE],&childVal,sizeof(childVal));
          printf("child: write value : %d\n",childVal);
      }
      close(mypipefd[READ]);     // Close the read end of the first pipe
      close(mypipefd2[WRITE]);   // Close the write end of the second pipe
  }

关于c - 使用 While 循环在 C 中的管道之间发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522920/

相关文章:

c - 程序查找图的两个给定顶点之间是否存在路径

c++ - ram 中的共享内存或命名管道?

c++ - 使用 boost::asio 时如何防止 SIGPIPE?

c - 在 C 中删除另一个字符串中出现的字符串(代码和错误消息)

c - 如何遍历数组将其元素解释为不同类型?

c - Makefile:尽管给出了目标,但没有制定目标的规则?

c - ssscanf 意外行为

c - 如何从另一个文件读取管道输入?

c中管道破裂的原因

c - 使用两个管道的双向进程间通信