返回

多处理-C如何通过管道从echo启动多个命令

发布时间:2022-08-11 21:38:42 366
# 数据

我为2个命令制作了多进程管道(echo "test" | wc). 然而,当我尝试为n命令(echo "test" | wc | cat|更多)我被困在环路内。

Echo始终是启动命令。

我认为我正确地关闭了未使用的描述符。

此外,我实际上是在从子进程执行回送,在父进程中接收数据并执行此操作while还有其他所有命令。这也是一个好方法吗?还是我让事情变得更复杂了。

int main(int argc, char *argv[]) {
    int status;
    int filedes[2];
    pid_t pid_enfant;
    pipe(filedes);

    char *wc[] = {"wc", NULL};
    char *cat[] = {"cat", NULL};
    char *echo[] = {"echo", NULL};
    char **cmd[] = { echo, wc , cat, NULL};
    int fd_in = 0;


    while (*cmd != NULL) {
        pipe(filedes);
        if ((pid_enfant = fork()) == -1) {
            exit(EXIT_FAILURE);
        } else if (pid_enfant == 0) {
            dup2(fd_in, 0); //change the input according to the old one
            if (*(cmd + 1) != NULL)
                dup2(filedes[1], 1);
            close(filedes[0]);
            if (strcmp((*cmd)[0], "echo") == 0) {
                char argums[strlen("echo") + strlen("football") + strlen("2> /dev/null") + 5]
                strcpy(argums, "echo \"football\" 2> /dev/null")

                char *tab[] = {"/bin/bash", "-c", argums, NULL};
                execv("/bin/bash", tab);
                return 1;
            } else {
                execvp((*cmd)[0], *cmd);
                exit(1);
            }
        } else {
            wait(NULL);
            close(filedes[1]);
            fd_in = filedes[0]; //save the input for the next command
            (*cmd)++;
        }
    }
}
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
下一篇
mongodb-从C运行原始mongo命令# 2022-08-11 19:57:17