Как использовать функцию wait () при разветвлении нескольких процессов? - PullRequest
2 голосов
/ 16 февраля 2010

Научиться использовать команду fork () и как передавать данные между родителем и его потомками. В настоящее время я пытаюсь написать простую программу для проверки работы функций fork и pipe. Кажется, моя проблема заключается в правильном использовании / размещении функции ожидания. Я хочу, чтобы родитель дождался завершения обработки обоих своих детей. Вот код, который у меня есть:

int main(void)
{
    int n, fd1[2], fd2[2];
    pid_t pid;
    char line[100];

    if (pipe(fd1) < 0 || pipe(fd2) < 0)
    {
        printf("Pipe error\n");
        return 1;
    }

    // create the first child
    pid = fork();

    if (pid < 0)
        printf("Fork Error\n");
    else if (pid == 0)  // child segment
    {
        close(fd1[1]);  // close write end
        read(fd1[0], line, 17); // read from pipe
        printf("Child reads the message: %s", line);

        return 0;
    }
    else    // parent segment
    {
        close(fd1[0]);  // close read end
        write(fd1[1], "\nHello 1st World\n", 17);   // write to pipe

        // fork a second child
        pid = fork();

        if (pid < 0 )
            printf("Fork Error\n");
        else if (pid == 0) // child gets return value 0 and executes this block
            // this code is processed by the child process only
        {
            close(fd2[1]);  // close write end
            read(fd2[0], line, 17); // read from pipe
            printf("\nChild reads the message: %s", line);
        }
        else
        {
            close(fd2[0]);  // close read end
            write(fd2[1], "\nHello 2nd World\n", 17);   // write to pipe

            if (wait(0) != pid)
                printf("Wait error\n");
        }

        if (wait(0) != pid)
            printf("Wait error\n");

    }

    // code executed by both parent and child
    return 0;
}   // end main

В настоящее время мой вывод выглядит примерно так:

./fork2 
Child reads the message:  Hello 1st World 
Wait error

Child reads the message:  Hello 2nd World 
Wait error

Где подходящее место, чтобы заставить родителя ждать?

Спасибо

Томек

Ответы [ 2 ]

4 голосов
/ 16 февраля 2010

Похоже, что это нормально (я не запускал, заметьте). Ваша логическая ошибка заключается в предположении, что дети закончатся в каком-то определенном порядке; не сверяйте результаты wait(0) с определенным pid, если вы не уверены, что знаете, какой из них вы собираетесь вернуть!

Edit:

Я запустил вашу программу; у вас есть хотя бы одна ошибка, ваш второй дочерний процесс вызывает wait(), чего вы, вероятно, не хотели делать. Я рекомендую разбить часть вашего кода на функции, чтобы вы могли более четко видеть порядок выполняемых операций без всего беспорядка.

0 голосов
/ 19 февраля 2010

я думаю, что лучше использовать что-то подобное, чтобы дождаться всех детей.

int stat;
while (wait(&stat) > 0)
   {}   
...