как выполнить ls | wc -w с помощью труб? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать программу-оболочку для выполнения конвейерной команды. Когда я звоню ls из разветвленного child & wc из parent, он работает нормально но если я позвоню в wc также из разветвленного дочернего родителя, он будет ждать (я не знаю, почему это происходит).

void execPiped(char** Args,char** pipedArgs)
{
    int pfds[2];
    pipe(pfds);
    pid_t pid1 = fork();
    if (pid1 == -1)
    {
        printf("\nFailed forking child..");
        return;
    }
    else if (pid1 == 0) //CHILD 1 EXECUTING
    {
        close(1);       //close STDOUT
        dup(pfds[1]);   //set pfds as STDOUT
        close(pfds[0]); //we don't need this
        if (execvp(Args[0], Args) < 0)
        {
            printf("\nCould not execute command..");
            exit(1);
        }
    }
    else {
        pid_t pid2 = fork();
        if (pid2 == -1)
        {
            printf("\nFailed forking child..");
            return;
        }
        else if (pid2 == 0) //CHILD 2 EXECUTING
        {
            close(0);       //close STDIN
            dup(pfds[0]);   //set pfds as STDIN
            close(pfds[1]); //we don't need this
            if (execvp(pipedArgs[0], pipedArgs) < 0)
            {
                printf("\nCould not execute command..");
                exit(1);
            }
        }
        else {  //Parent Executing
            //Wating for Children to exit
            wait(NULL);
            wait(NULL);
        }
        return;
    }
}
...