Создание более одного процесса с помощью fork

После серьезного обсуждения с моим другом мы решили спросить, на правильном ли пути наша интуиция. Проблема в функции fork(), точнее в дочерних процессах. Вот код:

int main()
{
    int status;
    if(!fork()) execl("pp1",NULL);
    if(!fork()) execl("pp2",NULL);
    if(!fork()) execl("pp3",NULL);
    wait(&status);
    return status;
}

Автор объясняет, что эта программа создаст только 3 дочерних процесса, но когда дело дойдет до первого дочернего процесса, она войдет в первое «если» и выполнит pp1 как новый процесс, но с тем же pid, что и у дочернего, и это нормально. . Проблема со вторым и третьим ребенком, как он будет запускать этот код. Наша интуиция такова, что до второго и третьего «если» мы не дойдем. Программа pp1 будет запущена 3 раза всеми тремя дочерними процессами.

Что вы думаете? Каков будет результат?


person user3691967    schedule 30.05.2014    source источник
comment
Было бы так сложно проверить себя?   -  person Kerrek SB    schedule 30.05.2014
comment
Не забывайте exec и друзья тоже могут потерпеть неудачу. И если они это сделают, то дочерний процесс перейдет прямо к следующему if.   -  person Crowman    schedule 30.05.2014
comment
Можете ли вы переписать это так, чтобы оно не ждало неинициализированную переменную?   -  person user240515    schedule 19.07.2021


Ответы (2)


Обратите внимание на возвращаемые значения fork(). От man 2 fork:

В случае успеха родительскому процессу возвращается PID дочернего процесса, а дочернему — 0. В случае неудачи в родительском процессе возвращается -1, дочерний процесс не создается, а errno устанавливается соответствующим образом.

Это означает, что дочерний процесс получает 0 после успешного форка. Когда !0 оценивается как true, ребенок выполняет execl, а отец переходит к следующему fork().

person hek2mgl    schedule 30.05.2014

Этот код выполнит pp1, затем pp2 и, наконец, pp3. Хорошо. Но может быть хорошей идеей также проверить возвращаемое значение execl. Если это не удастся, он не завершится (да, функции exec завершают работающий процесс).

Но я не знаю, что вы хотите сделать. Но для запуска двоичных файлов из программы C (даже если вы просто хотите получить возвращаемое значение этой программы), может (я говорю «может»;)) лучше использовать функцию «system ()». Она возвращает значение программы, переданной в параметре, и не выходит из программы после ее выполнения, в отличие от функций exec.

Я просто даю другое решение. Я не критикую это ;)

person Guillaume Munsch    schedule 30.05.2014