Что происходит, когда нет действий для родительского процесса во время процессов fork()?

У меня есть следующий пример кода:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

int main (){
    printf("hello world (pid:%d)\n", (int)getpid());
    int rc = fork();

    if(rc < 0){ //fork failed; exit
        fprintf(stderr, "fork failed\n");
        exit(1);

    } else if (rc == 0) { //child new process
        printf("hello, i am child (pid:%d)\n", (int)getpid());
        char *myargs[3];
        myargs[0] = strdup("wc"); //program: "wc" (word count)
        myargs[1] = strdup("p3.c"); //argument: file to count
        myargs[2] = NULL; //marks end of array
        execvp(myargs[0],myargs); //runs word count
        printf("this shouldn't print out");

    } else {//parent process
        // int wc = wait(NULL);
        // printf("hello, i am parent of %d (wc: %d) (pid: %d)\n", rc, wc, (int) getpid());
    }

    return 0;
}

Поэтому я закомментировал оператор else (аргументы или действия родительского процесса. Мне было интересно, что произойдет, или выходные данные останутся прежними, если родительскому процессу не нужно ждать дочернего процесса? Если да, Почему?

Я подумал, что, поскольку дочерний процесс является независимым процессом от родителя, результат останется прежним, но единственная ли это причина?

Некоторые указатели были бы хороши, спасибо!


person Sam Danist    schedule 31.10.2017    source источник
comment
Родительский процесс перейдет к return 0 и завершится, оставив дочерний процесс сиротой.   -  person Some programmer dude    schedule 31.10.2017
comment
@Someprogrammerdude Итак, родительский процесс завершится до того, как дочерний процесс завершит выполнение execvp, количество слов?   -  person Sam Danist    schedule 31.10.2017
comment
Точное время завершения родительского процесса по отношению к дочернему не определено, но, скорее всего, он завершится до завершения wc программы. Да, и поскольку процессы независимы, дочерний процесс будет продолжать работать, даже если родительский процесс завершится.   -  person Some programmer dude    schedule 31.10.2017
comment
И поскольку это независимый процесс, вывод программы подсчета слов останется прежним, даже если родительский процесс завершится первым, верно? Я просто хочу убедиться, что я правильно понимаю.   -  person Sam Danist    schedule 31.10.2017
comment
Да, это правильно.   -  person Some programmer dude    schedule 31.10.2017
comment
Большое спасибо, я ценю всю помощь!   -  person Sam Danist    schedule 31.10.2017
comment
размещенный код не компилируется! Среди прочего, в нем отсутствуют необходимые операторы #include для необходимых файлов заголовков. Вы ожидаете, что мы догадаемся, какие файлы заголовков включает ваш фактический код?   -  person user3629249    schedule 31.10.2017
comment
возвращаемый тип из fork() — это pid_t, который не обязательно является int   -  person user3629249    schedule 31.10.2017
comment
родительский процесс должен вызывать wait() или waitpid(), иначе родительский процесс немедленно завершится, оставив дочерний процесс зомби. Единственный способ избавиться от зомби-процессов — перезагрузить компьютер.   -  person user3629249    schedule 31.10.2017
comment
после этой строки: execvp(myargs[0],myargs); следующая строка должна быть: perror( "execvp failed" ); then exit(EXIT_FAILURE);`   -  person user3629249    schedule 31.10.2017
comment
при вызове strdup() всегда проверяйте (!=NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно   -  person user3629249    schedule 31.10.2017
comment
для простоты чтения и понимания: 1) следуйте аксиоме: только одно выражение в строке и (максимум) одно объявление переменной в выражении. 2) имена переменных должны указывать content или usage (или, лучше, оба ) такие имена, как wc и rc, не имеют смысла даже в текущем контексте 3) отдельные блоки кода (for, if, else, while, do...while, switch, case, default) через одну пустую строку   -  person user3629249    schedule 31.10.2017
comment
@ user3629249 Ваш комментарий о зомби содержит три фактические ошибки. 1. Родительский процесс может не ждать дочерний процесс. Так, среди прочего, порождаются демоны. 2. Это не сделает ребенка зомби, это не зомби. На самом деле выход из родительского процесса — это самый простой способ избавиться от процессов-зомби. 3. Процессы-зомби прекрасно очищаются на всех известных мне системах, и перезагрузка не требуется.   -  person Art    schedule 31.10.2017
comment
@user3629249 user3629249 Я включил файлы заголовков, и этот код является примером кода из моего учебника, который я пытался понять.   -  person Sam Danist    schedule 31.10.2017
comment
Также обратите внимание, что fork() возвращает pid_t, а не int. Вы будете удивлены, если pid_t не впишется в int — а нет никакой гарантии, что он войдёт, именно поэтому он был создан в первую очередь.   -  person Andrew Henle    schedule 31.10.2017
comment
@Art, зомби-процесс - это процесс, у которого нет родителя. (вы знаете, что существует цепочка процессов, которая простирается до (в linux) процесса init()) Когда родительский процесс завершается, цепочка прерывается. (Все еще работающий) дочерний процесс теперь является зомби.   -  person user3629249    schedule 31.10.2017
comment
@user3629249 user3629249 Это не зомби. Я знаю, как работают процессы, так как я действительно работал над управлением процессами в реальной операционной системе. В том числе и собственно создание зомби. И пожинать их.   -  person Art    schedule 01.11.2017


Ответы (1)


Это можно понять в двух контекстах.

  1. Время выполнения родителя ‹ время выполнения дочернего элемента
  2. Время выполнения родителя > время выполнения дочернего элемента

В случае 1 родительский процесс завершается раньше дочернего, и, следовательно, процесс инициализации (pid 1) становится родителем дочернего; дочерний процесс продолжает выполнение.

Обычно дочерний процесс (ресурсы дочернего процесса) не может быть освобожден до завершения родительского процесса. В случае 2 дочерний процесс освобождается только после завершения родительского процесса; до этого времени дочерний процесс становится зомби (несуществующим в команде ps -al).

В этом конкретном контексте, когда родительскому процессу нечего выполнять, время выполнения дочернего процесса> время выполнения родительского, что есть не что иное, как время выполнения родительского процесса ‹ время выполнения дочернего процесса. сильный>. Это случай 1. Следовательно, родительский процесс завершается, а процесс инициализации становится родителем дочернего процесса.

person surendra nath    schedule 31.10.2017