将管道放入stdin另一个过程

时间:2014-02-17 06:58:05

标签: fork pipe stdin

我正在使用管道将一组数字发送到另一个进程来对它们进行排序。到目前为止,我可以使用fdopen从另一个进程获得结果。但是,我无法弄清楚如何从管道发送数据作为stdin用于另一个进程。

这是我的代码:

        int main ()
        {
            int fd[2], i, val;
            pid_t child;
            char file[10];
            FILE *f;

        pipe(fd);

        child = fork();
        if (child == 0)
        {
            close(fd[1]);
            dup2(fd[0], STDIN_FILENO);
            close(fd[0]);
            execl("sort", "sort", NULL);

        }
        else
        {
            close(fd[0]);
            printf ("BEFORE\n");
            for (i = 100; i < 110; i++)
            {
                write(fd[1], &i, sizeof (int));
                printf ("%d\n", i);
            }
            close(fd[1]);
            wait(NULL);
        }
    }

pipe(fd); child = fork(); if (child == 0) { close(fd[1]); dup2(fd[0], STDIN_FILENO); close(fd[0]); execl("sort", "sort", NULL); } else { close(fd[0]); printf ("BEFORE\n"); for (i = 100; i < 110; i++) { write(fd[1], &i, sizeof (int)); printf ("%d\n", i); } close(fd[1]); wait(NULL); } }

那么,其他过程如何获得输入? SCANF?

1 个答案:

答案 0 :(得分:0)

我认为您的管道设置正确。问题可能从execl()开始。对于此调用,您应指定绝对路径,如果您指的是Unix实用程序,则可能为/bin/sort。还有一个版本的呼叫execlp()可以在PATH上自动搜索。

下一个问题是sort是基于文本的,更具体地说是基于行的,并且您正在向其STDIN发送二进制垃圾。

在父进程中,您应该将格式化文本写入管道。

FILE *wpipe = fdopen(fd[1], "w");
for (i = 100; i < 110; i++) {
    fprintf(wpipe, "%d\n", i);
    ...
}
fclose(wpipe);

从110下降到100的反向循环可能会更好地测试您的排序。