父进程不会收集子返回变量

时间:2015-05-30 17:13:04

标签: c piping multiple-processes

这是一个类,所以我试图理解为什么在子进程返回时没有设置变量nChars。我已经读过waitpid()收到子进程,但是当我尝试打印nChars时,当孩子的nChars是命令行字符的数量时,它仍然显示为零

int main(int argc, char **argv)
{
    // set up pipe
  int      fd[2], status;
  pid_t    childpid;

  pipe(fd);
    // call fork()
  if((childpid = fork()) == -1){
    perror("pipe");
    return -1;
  }
  if (childpid == 0) {
        // -- running in child process --
        int     nChars = 0;
        char    ch;

        close(fd[1]);
        // Receive characters from parent process via pipe
        // one at a time, and count them.

        while(read(fd[0], &ch, 1) == 1)nChars++;

        // Return number of characters counted to parent process.
        printf("child returns %d\n", nChars);
        close(fd[0]);

        return nChars;
    }
    else {
        // -- running in parent process --
        int     nChars = 0;
        close(fd[0]);

        printf("CS201 - Assignment 3 - \n");

        // Send characters from command line arguments starting with
        // argv[1] one at a time through pipe to child process.

        for(int i=1; i < argc; i++)
            write(fd[1], argv[i], strlen(argv[i]));


        // Wait for child process to return. Reap child process.
        // Receive number of characters counted via the value
        // returned when the child process is reaped.

        waitpid(childpid, &status, WNOHANG);
        printf("child counted %d characters\n", nChars);
        close(fd[1]);
  return 0;
  }

1 个答案:

答案 0 :(得分:2)

父母和孩子不共享记忆,因此他们有不同的变量nChars。子项是父项的副本,因此当您更改副本中的某些变量时,它们不会更改为原始变量。 如果需要从两个执行流中看到一个变量,请使用线程。

您将来自子级的nChars作为进程退出代码返回,因此它将处于状态变量中。 尝试:

0xFF

但最好使用管道或套接字之类的IPC机制在子节点之间传输数据,因为退出代码用于程序退出状态,退出代码0表示一切正常,其他退出代码表示出现问题,退出代码不是用于传输任意数据