Почему waitpid зависает и не пожинает все дочерние процессы? - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь смоделировать командную оболочку, обрабатывающую команды переднего плана, но у меня возникают проблемы, когда дело доходит до запуска дочерних процессов. Я порождаю несколько процессов, используя fork в следующем коде.

while (currCmdListNode != list_end(&currentPipeline->commands)) { 

            if (fork() == 0) 
            {
                printf("Child created with pid %d \n", getpid());
                currentCmd = list_entry(currCmdListNode, struct esh_command, elem);
                execvp(currentCmd->argv[0], currentCmd->argv);
            }

            currCmdListNode = list_next(currCmdListNode);
        }

Затем я пытаюсь собрать все эти процессы из родительского процесса, используя следующий код.

        while((pid = waitpid(-1, &status, WUNTRACED)) > 0)
        {
           if (WIFEXITED(status))
           {
              printf("child %d terminated normally with exit status=%d\n", pid, WEXITSTATUS(status));
           }
           else 
           {
              printf("child %d terminated abnormally\n", pid);
           }
       }

Допустим, я запустите этот код, чтобы два дочерних процесса порождались из моего начального форка. Моя функциональность reap вернется, сказав, что она пожала первого ребенка. Тем не менее, он будет зависать, как только он нажмет на waitpid во второй раз, и я никогда не получу сообщение о том, что оно пожало второго ребенка. Если я порожу четыре дочерних процесса, то, возможно, два будут пожинены, а затем зависнет. Что здесь происходит? Должен ли я делать какую-то блокировку сигнала SIGCHLD? Если так, где я должен блокировать это?

...