#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
является ли строка буферизованной. Это означает, что он фактически не будет выводиться до тех пор, пока не будет обнаружена новая строка или не будет выполнена явная очистка (например, при завершении процесса). Таким образом, в вашем случае удаление изменений новой строки происходит, когда родительский процесс фактически выводит данные. Поскольку родитель ждет выхода ребенка, это означает, что родительский сброс произойдет после вывода ребенка.