进程间通信似乎悬而未决

时间:2014-06-02 04:59:52

标签: c pipe parent-child interprocess

这是一个程序,旨在从程序调用中获取字符,一次一个地将它们传递给子项,在子项中计算它们,将该值返回到父项并打印该值。 由于某种原因,输入的字符数不会被显示。它编译时没有错误并运行,但没有正确退出。这让我相信父母没有成功地收获孩子并从中获取回报价值。

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


int main(int argc, char **argv)
{
    int comm[2];
    char buffer[50];
    pid_t   pid;

    // set up pipe

    pipe(comm);

    // call fork()
    pid = fork();

    // code that runs in the child  
    if (pid == 0) {
        // -- running in child process --
        int     nChars = 0;

        close(comm[1]);

        // Receive characters from parent process via pipe
        // one at a time, and count them.

        while(read(comm[0], buffer, 1) ==1) {
            ++nChars;
        }

        // Return number of characters counted to parent process.
        return nChars;
    }
    else {
        // -- running in parent process --
        int     nChars = 0;
        int     size = 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.
        close(comm[0]);
        for (int i = 1; i < argc ; i++) {
            size = strlen(argv[i]);
            for (int j = 0; j < size; j++) {
            write(comm[1], &argv[i][j], 1);
                }
            }

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

        wait(&nChars);
        printf("child counted %d chars\n", nChars/256);
        return 0;
        }
}

1 个答案:

答案 0 :(得分:2)

您的父进程需要在完成写入后关闭管道。

// Send characters from command line arguments starting with
// argv[1] one at a time through pipe to child process.
close(comm[0]);
for (int i = 1; i < argc ; i++) {
    size = strlen(argv[i]);
    for (int j = 0; j < size; j++) {
        write(comm[1], &argv[i][j], 1);
    }
}
close(comm[1]); // <--- add this