将stdout提供给子进程,该进程将execv()排序

时间:2017-09-15 00:20:55

标签: c sorting pipe posix child-process

我试图找出如何将一个进程的输出发送到子进程。我已经学习了文件描述符和管道。我想我几乎就在那里,但我错过了一个关键部分。

这是我到目前为止所做的:

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

int main(int argc, char *argv[]) {
    int fd[2];
    pid_t sort_pid;


    /* Create the pipe */
    if(pipe(fd) == -1) {
        fprintf(stderr, "Pipe failed\n");
        exit(EXIT_FAILURE);
    }
    /* create child process that will sort */
    sort_pid = fork();
    if(sort_pid < 0) { // failed to fork
        fprintf(stderr, "Child Fork failed\n");
        exit(EXIT_FAILURE);
    }
    else if(sort_pid == 0) { // child process
        close(0);   // close stdin
        dup2(fd[0], 0); // make stdin same as fd[0]
        close(fd[1]); // don't need this end of the pipe
        execlp("D:/Cygwin/bin/sort", "sort", NULL);
    }
    else { // parent process
        close(1); // close stdout
        dup2(fd[1], 1); // make stdout same as fd[1]
        close(fd[0]); // don't need this end of the pipe
        printf("Hello\n");
        printf("Bye\n");
        printf("Hi\n");
        printf("G'day\n");
        printf("It Works!\n");
        wait(NULL);
    }

    return EXIT_SUCCESS;
}

这不起作用,因为它似乎进入无限循环或其他什么。我尝试了wait()的组合,但这也没有帮助。

我这样做是为了学习如何在我的实际程序中应用这个想法。在我的实际程序中,我读取文件,逐行解析它们并将处理后的数据保存到静态结构数组中。我希望能够根据这些结果生成输出,并使用fork()和execv()系统调用来对输出进行排序。

这最终是针对uni的项目。

这些类似的例子我分析到目前为止的阶段:

此外,我阅读相关系统调用的手册页以尝试理解它们。我承认我对管道和使用它们的知识基本上没什么,因为这是我第一次尝试使用它们。

任何帮助都表示赞赏,甚至可以查看我自己的更多信息来源。我似乎已经厌倦了谷歌搜索给我的大部分有用的东西。

1 个答案:

答案 0 :(得分:1)

for item in data: print item['hash'] print item['gasUsed'] 会一直读到它遇到文件结尾。因此,如果要完成,必须关闭管道的写入端。由于sort,您有open file description的两个副本,因此您需要

    在致电dup2 后的任何时间
  1. close(fd[1]); 写完(新)dup2
  2. 后,
  3. close(1);

    请确保在第二项之前stdout,以确保您的所有数据真正进入管道。

    (这是一个死锁的简单示例:fflush(stdout)正在等待管道关闭,这将在父项退出时发生。但是父项将在完成等待子项退出之后才会退出...)