Что не так с моей многопроцессорной программой?

Я делаю программу с целью создания процесса в рамках процесса 3 раза (получить дочерний процесс (1), гранд дочерний процесс (2) и гранд внучатый процесс (3)) и выполнять действия в каждом процессе в обратном порядке порядка создания. Это означает, что сначала я выполняю действия (3), затем действия (2), затем (1), а затем родительского процесса. Но вывод странный, как выполнение 6 printfs и нескольких процессов, говорящих, что у них одинаковый pid.

Код:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t mypid = getpid();
    pid_t child1_pid=fork();


    pid_t child2_pid=-1; //waiting for child1 to fork
    pid_t child3_pid=-1; //waiting for child2 to fork

    int status;

    if(child1_pid==0)
    {
        mypid=getpid();
        child2_pid=fork()

        if(child2_pid==0)
        {
            mypid=getpid();
            child3_pid=fork()

            if(child3_pid==0)
            {
                mypid=getpid();
                printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
            }
            wait(&status);
            printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
        }
        wait(&status);
        printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
    }
    else
    {
        wait(&status);
        printf("\nIm the father and my pid is %ld\n", mypid);
    }
    return 0;
}   

Я спрашиваю о том, что я делаю неправильно, и где моя логика неверна, и, возможно, укажет мне на чтение в Интернете. Заранее спасибо.

2 ответа

Решение
if(child1_pid==0)
    {
        mypid=getpid();
        child2_pid=fork()

        if(child2_pid==0)
        {
            mypid=getpid();
            child3_pid=fork()

            if(child3_pid==0)
            {
                mypid=getpid();
                printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
            }
            wait(&status);
            printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
        }
        wait(&status);
        printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
    }

В этом коде великий внук напечатает 3 раза: printf внутри его if и внешние 2.

Внучка напечатает свой printf, его внешний и так далее.

Ваши новые процессы продолжают нормально выполнять остальную часть вашего кода, что означает, что он напечатает следующие printf, которые существуют в коде.

Чтобы код выполнялся по вашему желанию, вы должны прекратить выполнение в каждом дочернем процессе, а каждый родительский процесс должен дождаться завершения дочернего процесса перед печатью.

Следующее должно работать по вашему желанию.

if(child1_pid==0)
{
    mypid=getpid();
    child2_pid=fork()

    if(child2_pid==0)
    {
        mypid=getpid();
        child3_pid=fork()

        if(child3_pid==0)
        {
            mypid=getpid();
            printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
            return 0;
        }
        waitpid(child3_pid,&status,0);
        printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
        return 0;
    }
    waitpid(child2_pid,&status,0);
    printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}else
{
    waitpid(child1_pid,&status,0);
    printf("\nIm the father and my pid is %ld\n", mypid);
}
return 0;

Функция waitpid ожидает завершения указанного процесса pid. Объявления функций следующие:

pid_t waitpid(pid_t pid, int *status,int options);

Значение 0 для параметра options, использованного в показанном ранее коде, указывает на то, что он должен работать по умолчанию (дождаться завершения процесса).

Добавляя к ответу DMH, вы должны также использовать write() вместо printf, так как printf буферизирует выходные данные, поэтому результаты могут быть смешаны в конце выходных данных.

http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html

Другие вопросы по тегам