未初始化的数组传入管道(2)

时间:2016-10-02 23:00:35

标签: c operating-system system-calls

我正在查看如何在手册页上使用pipe(2),我不明白他们提供的源代码中的一行。

   int
   main(int argc, char *argv[])
   {
       int pipefd[2]; //Isn't this undefined??? so pipe(pipefd) would throw an error?
       pid_t cpid;
       char buf;

       if (argc != 2) {
           fprintf(stderr, "Usage: %s <string>\n", argv[0]);
           exit(EXIT_FAILURE);
       }

       if (pipe(pipefd) == -1) {
           perror("pipe");
           exit(EXIT_FAILURE);
       }

       cpid = fork();
       if (cpid == -1) {
           perror("fork");
           exit(EXIT_FAILURE);
       }

       if (cpid == 0) {    /* Child reads from pipe */
           close(pipefd[1]);          /* Close unused write end */

           while (read(pipefd[0], &buf, 1) > 0)
               write(STDOUT_FILENO, &buf, 1);

           write(STDOUT_FILENO, "\n", 1);
           close(pipefd[0]);
           _exit(EXIT_SUCCESS);

       } else {            /* Parent writes argv[1] to pipe */
           close(pipefd[0]);          /* Close unused read end */
           write(pipefd[1], argv[1], strlen(argv[1]));
           close(pipefd[1]);          /* Reader will see EOF */
           wait(NULL);                /* Wait for child */
           exit(EXIT_SUCCESS);
       }
   }

我认为非静态函数变量只是内存中的任何内容?为什么这个源代码有效?

2 个答案:

答案 0 :(得分:3)

pipefd数组在此处作为输出参数,因此无需初始化它。 pipe函数写入

答案 1 :(得分:0)

数组pipefd返回引用管道末尾的2个fds。这里,pipefd [1]指的是管道的写端,pipefd [0]指的是管道的读端。

在上述计划中:

  1. pipefd [1]不用于儿童,因此关闭。子节点从pipefd [0]读取数据。
  2. 请注意,如果管道为空则读取阻塞,如果管道已满,则写入阻塞。

    1. pipefd [0]未在父级中使用,因此它已关闭。数据由父级写入pipefd [1]。
    2. 另请注意,由于管道是单向的,因此写入管道写入端(pipefd [1])的数据将由内核缓冲,直到从管道的读取端读取(pipefd [0])。