【问题标题】:C pipe, fork, dup, and exec()C 管道、fork、dup 和 exec()
【发布时间】:2013-05-06 18:42:40
【问题描述】:

我正在尝试通过管道将字符串列表传递给子进程,它应该使用execl() 通过/bin/cat 显示。我让它早点工作,只是管道没有关闭,所以程序一直在等待。不知道我做了什么,现在它根本不起作用。有人可以看到我的代码并告诉我 str 数据在子进程中没有被 cat 显示吗?

int main(int argc, char** argv) {

    char *str[] = {"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"};
    int fds[TOTAL_CHILDREN];
    int writeFds;
    int catPID;
    int status;

    FILE * write_to_child;

    //create pipe
    if (pipe(fds) == -1) {
        perror("creating pipe: failed");
        exit(EXIT_FAILURE);
    }
    pipe(fds);
    //create subprocess for cat child

    switch (catPID) {
        case 0: // successful creation of child
            close(fds[1]); //close write side from parents
            close(0); //close stdin
            dup(fds[0]); //connect pipe from execl cat to stdin

            execl("/bin/cat", "cat", (char *) 0);
            perror("exec failed!");
            exit(20);
            break;

        case -1: //failure
            perror("fork failed: cat process");
            exit(EXIT_FAILURE);

        default: //parent process
            close(fds[0]);

            writeFds = fds[1];
            write_to_child = fdopen(fds[1], "w");

            if (write_to_child == NULL) {
                perror("write to pipe failed");
                exit(EXIT_FAILURE);
            }
            break;


    }

    int i;
    for (i = 0; i < 9; i++){
        fprintf(write_to_child, "%s\n", str[i]);
    }

    fclose(write_to_child);
    close(writeFds);

    wait(&status);

    return (EXIT_SUCCESS);
}

【问题讨论】:

  • 如果你要问一个关于fork()的问题,你应该在程序中调用fork()
  • Tnanks,这是真的!
  • 我之前有它工作......不知道我做了什么,现在它根本不工作 - 这就是为什么你应该使用 VCS(版本控制系统)来管理代码。当某些东西运行得很好时,您可以保存一个版本,以便您有一个记录,如果您以后再次搞砸,您可以返回到该记录。即使在类的玩具程序中,在开发过程中使用 VCS 也有好处。 (我在git 存储库中保留了很多我的 SO 答案,如果我需要解决问题中的一些棘手问题,我会创建一个分支,复制并保存原始代码,然后开始处理我的答案。 )

标签: c exec fork pipe


【解决方案1】:

您可能想要添加该行

catPID = fork();

我不知道为什么你有两次pipe(fds)

【讨论】:

  • 你像忍者一样调试!非常感谢。我不知道我在做什么,但我删除了叉子并复制了管道。您是否碰巧知道我可以引用这些系统调用的任何资源?现在您已经解决了我的问题,我想从 cat 读取所有值以进行排序。我想我创建了从第一个孩子到另一个 fork() 的孩子的管道?
  • man 总是一个很好的查找系统调用的命令,在第 2 节中。你可以做另一个管道,但为什么不直接用 sort 替换 cat 呢? cat 只是将标准输入复制到标准输出。
  • 这就是我用 sort 替换 cat 但得到排序值后我必须删除重复的单词。
  • sort -u 将删除重复项
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多