Нет чередования в выводе, в то время как родитель и потомок пишут в стандартный вывод

Zhiyuan Ruan спросил: 07 октября 2018 в 12:22 в: c

Я пытался написать код, чтобы увидеть, как использовать fork для создания дочернего процесса. Поскольку дочерний объект наследует файловый объект и дескриптор от родительского, если и дочерний, и родительский записи пишут в стандартный вывод, в выходных данных должно быть чередование, если я правильно понимаю. В следующем коде, который я пишу, я объявляю две строки как родительской, так и дочерней, и записываю их в стандартный вывод. То, что я наблюдаю, это то, что на выходе нет чередования. Я что-то пропускаю?

Код:

#include <unistd.h>
#include <stdio.h> 
#include <stdlib.h>
#include <sys/wait.h>int main() {
  pid_t return_value;
  pid_t wait_p;
  if ((return_value = fork()) != 0) {
     char pa[15]= "Hi from parent\n";
     char pa_2[18]= "Hello from pariii\n";
     write(1, pa, 15);
     write(1, pa_2, 18);
  } else {
     char c[17] = "Hello from child\n";
     char c_2[14] = "Hi from chiii\n";
     write(1, c , 17);
     write(1, c_2, 14);
  }
  exit(0);
}

Вывод на моем компьютере (Ubutun 18.04, соответствует gcc):

Hi from parent
Hello from pariii
Hello from child
Hi from chiii

Я вижу, как атомарная природа записи может привести к тому, что процесс не будет чередоваться. Но почему выходные данные выглядят так, как будто родитель выполняет сначала всю запись, а потом ребенок выполняет запись? Кроме того, независимо от того, сколько раз я пытался это сделать, родитель всегда пишет, а потом пишет.

0 ответов