简体   繁体   English

C管道,fork,dup和exec()

[英]C pipe, fork, dup, and exec()

I'm trying to pass list of strings through pipe to child process where it should display through /bin/cat using execl() . 我正在尝试通过管道传递字符串列表到子进程,它应该通过/bin/cat使用execl() I had it working earlier except that the pipe did not close so the program kept waiting. 我之前有工作,除了管道没有关闭所以程序一直在等待。 Don't know what I did and now it is not working at all. 不知道我做了什么,现在根本不工作。 Can someone see my code and tell me what am I doing wrong that the str data is not being displayed by cat in child process? 有人可以看到我的代码并告诉我,我在做什么错误,在子进程中cat没有显示str数据吗?

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

You probably want to add the line 您可能想要添加该行

catPID = fork();

and I'm not sure why you've got pipe(fds) twice 而且我不确定为什么你有两次pipe(fds)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM