【问题标题】:put pipe to stdin another process将管道放到标准输入另一个进程
【发布时间】:2014-02-17 06:58:05
【问题描述】:

我正在使用管道将一组数字发送到另一个进程以对其进行排序。到目前为止,我能够使用 fdopen 从另一个进程中获取结果。但是,我不知道如何将管道中的数据作为标准输入发送给另一个进程。

这是我的代码:

        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);
        }
    }

顺便说一句,其他进程如何获得输入?扫描?

【问题讨论】:

    标签: fork pipe stdin


    【解决方案1】:

    我认为您的管道设置正确。问题可能从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 的反向循环可能会更好地测试您的排序。

    【讨论】:

    • 我自己写的排序,但多亏了你,我意识到它是基于文本的;因此,当我将所有内容更改为字符串时,它可以完美运行:)
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2017-07-24
    • 2021-07-10
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多