Родительский процесс не запускается при вызове fork (), функция не возвращается - PullRequest
0 голосов
/ 31 января 2020

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

int main() {
    int x = 100;
    int fork_result = fork();
    if (fork_result < 0) {
        fprintf(stderr, "Fork failed.\n");
        exit(1);
    } else if (fork_result == 0) {
        printf("Child value before: %d\n", x);
        x = 200;
        printf("Child value after: %d\n", x);
    } else {
        printf("Parent value before: %d\n", x);
        x = 300;
        printf("Parent value after: %d\n", x);
    }
    return 0;
}

И вывод, который я получаю при запуске:

Child value before: 100
Child value after: 200

По который программа продолжает работать бесконечно без возврата. Что здесь происходит?

Спасибо.

Ответы [ 2 ]

1 голос
/ 31 января 2020

Нашел мой же вопрос здесь:

https://unix.stackexchange.com/questions/23228/there-is-no-bash-indicator-prompt-after-a-forked-process-terminates

Это дает хороший ответ и, кажется, то, что происходит. Спасибо всем за ваши ответы.

1 голос
/ 31 января 2020

Когда я компилировал ваш код, он не работал при ошибках компиляции из-за отсутствия заголовков и нескольких синтаксических ошибок. Исправление тех, которые он бежал, как ожидалось для меня. Если ваш компилятор настроен на игнорирование предупреждений, или такие странные вещи могут произойти, если функции не созданы правильно.

В образовательных целях я добавил несколько дополнительных строк в ваш код.

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

int main() {
    int x = 100;
    printf( "sizeof pid_t: %d\n", (int)sizeof(pid_t) );
    fflush( stdout );
    pid_t fork_result = fork();
    if (fork_result < 0) {
        fprintf(stderr, "Fork failed.\n");
        exit(1);
    } else if (fork_result == 0) {
        sleep(2);
        printf("Child value before: %d\n", x); 
        x = 200;
        printf("Child value after: %d\n", x); 
        printf("Child fork_result=%d\n", (int)fork_result);
        return(42);
    } else {
        printf("Parent value before: %d\n", x); 
        x = 300;
        printf("Parent value after: %d\n", x); 
        printf("Parent fork_result=%d\n", (int)fork_result);
        int   xit_stat;
        pid_t xit_wait = waitpid( fork_result, &xit_stat, 0 );
        printf("Parent sees exit=%d\n", xit_stat >> 8); 
    }   
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...