Почему child_1 будет выводиться перед родительским?

#c #fork

Вопрос:

У меня есть код на языке Си, в котором родительский процесс будет fork() дочерним процессом:

 int main(){
    pid_t child_1;
    child_1 = fork();
    if (child_1 > 0){
        printf("Parent: (PID %d)n", getpid());
        wait(NULL);
    }
    else if (child_1 == 0){
        printf("child: %d", getpid());
    }
}
 

И результат таков:

 Parent: (PID 1234)
child: 1235
 

Но если бы я удалил n в printf родительском, вывод стал бы:

 child: 1235Parent: (PID 1234)
 

Я не уверен, почему, и я пробовал на разных ОС, и результат один и тот же. Заранее спасибо.

Комментарии:

1. Поскольку процессы, скорее всего, выполняются параллельно, строго говоря, вы не должны ожидать какого-либо определенного порядка.

2. @Cheatah Спасибо за такой быстрый ответ. Таким образом , это не вызвано n входом printf() , и это иногда будет происходить, если у меня есть n , если я правильно понимаю? Но я пытался запускать и то и другое снова и снова, я всегда получал один и тот же результат с n персонажем или без него.

3. printf является ли строка буферизованной. Это означает, что он фактически не будет выводиться до тех пор, пока не будет обнаружена новая строка или не будет выполнена явная очистка (например, при завершении процесса). Таким образом, в вашем случае удаление изменений новой строки происходит, когда родительский процесс фактически выводит данные. Поскольку родитель ждет выхода ребенка, это означает, что родительский сброс произойдет после вывода ребенка.

4. @kaylum В этом есть большой смысл, большое тебе спасибо.

Ответ №1:

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