简单的叉子和管道

时间:2015-02-08 19:11:36

标签: c linux pipe fork

我正在尝试理解操作系统类中的分叉和管道。我不知道为什么第二个子进程不会打印出meminfo。如果我打印它似乎写入管道,但它不会读取第二个子进程中的任何内容。我错过了允许第二个进程从管道读取的东西吗?

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>

#define R_FILE "/proc/meminfo"
#define BSIZE 256
#define READ_END 0
#define WRITE_END 1

int main()
{
  int status;
  pid_t pid_1, pid_2;

  int pipefd[2];
  pipe(pipefd);

  pid_1 = fork();
  if (pid_1 == 0) {
    /* process a */

    int rfd;
    size_t rsize;
    char buf[BSIZE];
    close(pipefd[READ_END]);
    if ((rfd = open(R_FILE, O_RDONLY)) < 0) {
      fprintf(stderr, "\nError opening file: %s. ERROR#%d\n", R_FILE, errno);
      return EXIT_FAILURE;
    }

    /* read contents of file and write it out to a pipe */
    while ((rsize = read(rfd, buf, BSIZE)) > 0) {
      /* This should write to a pipe */
      write(pipefd[1], buf, rsize);
    }

    close(pipefd[WRITE_END]);
    close(rfd);
    return 0;
  }

  pid_2 = fork();
  if (pid_2 == 0) {
    /* process b */
    size_t rsize;
    char buf[BSIZE];
    /* read from pipe and write out contents to the terminal */
    close(pipefd[WRITE_END]);
    /*  Thishis should read from a pipe */

      while ((rsize = read(pipefd[1], buf,BSIZE)) > 0) {
        write(STDOUT_FILENO, buf, rsize);

         }

    close(pipefd[READ_END]);

    return 0;
  }

  /* shell process */
  if ((waitpid(pid_1, &status, 0)) == -1) {
    fprintf(stderr, "Process 1 encountered an error. ERROR%d", errno);
    return EXIT_FAILURE;
  }

  if ((waitpid(pid_2, &status, 0)) == -1) {
    fprintf(stderr, "Process 2 encountered an error. ERROR%d", errno);
    return EXIT_FAILURE;
  }

  return 0;
}

1 个答案:

答案 0 :(得分:1)

在过程中你可能会读错了fd read(pipefd[1], buf,BSIZE)。将其替换为read(pipefd[READ_END], buf,BSIZE)