dup2()正在阻止子进程? C

问题描述 投票:0回答:1

我正在编写一个函数,该函数将一个输入回显给一个sed,然后回传另一个sed。我以正确的方式使用了我所有的等待信号,但是我得到的最后一个打印结果是在回显中的第一个子进程中调用dup2()之前。

void sendbc (char * str_ ) {
    int fd[2];
    int fd1[2];
    int pid,pid1;
    char* echo[] = {"echo", str_,NULL};
    char* sed1[] = {"sed","s/[^:]*;"" " "//",NULL};
    char* sed2[] = {"sed","s/[^:]*."" " "//",NULL};
    int status,er;
    FILE *f;
    if(pipe(fd) < 0){
        exit(100);
    }
    if(pipe(fd1) < 0){
        exit(100);
    }

    pid = fork();
    if (pid == 0) {
        dup2(fd[1], 1) //last command before blocking
        close(fd[1]);
        close(fd[0]);
        execvp(echo[0], echo);
        printf("Error in execvp1\n");
    }else{
        wait(&status);
        pid = fork();
        if (pid == 0){
            dup2(fd[0], 0);
            dup2(fd1[1], 1);
            dup2(fd1[1], 2);
            close(fd[1]);
            close(fd[0]);
            close(fd1[1]);
            close(fd1[0]);
            execvp(sed1[0],sed1);
            printf("Error in execvp2\n");
        }else{
            wait(&status);
            dup2(fd1[0],0);
            dup2(1,2);
            //dup2(1,1);
            close(fd1[1]);
            close(fd1[0]);
            execvp(sed2[0],sed2);
            printf("Error in execvp3\n");
        }
    }

    if(pid!=0)
        wait(&status);
    close(fd[0]);
    close(fd[1]);
    close(fd1[1]);
    close(fd1[0]);
}

我可以想象2种可能性... dup2正在阻塞,或者我需要创建更多进程,因为它在调用时结束了进程,但是在快速阅读他的手册页后,听起来不对...这可能是什么?

我正在编写一个函数,该函数将一个输入回显给一个sed,然后回传另一个sed。我以正确的方式使用了我所有的等待信号,但我得到的最后一个打印结果是在第一个孩子中调用dup2()之前...

c pipe fork wait dup
1个回答
0
投票

一般问题

© www.soinside.com 2019 - 2024. All rights reserved.