Неожиданный вывод fork() при перенаправлении в file.txt

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

int main() {
    printf("Hi");
    fork();
    return 0;
}

Мой первый вопрос: почему я получаю Привет два раза? это объясняется в разделе Работа fork() в Linux GCC, но все же я хочу, чтобы кто-то объяснил более просто.

мое второе сомнение: когда я перенаправляю свои выходные данные в somefile.txt, даже если я использую символ новой строки (\n), выходные данные:

Привет

Привет

пожалуйста, объясни...

пожалуйста, предоставьте мне некоторые детали, если я пропустил, в понимании fork()

2 ответа

почему я получаю привет два раза?

Если вы напишите:

#include <stdio.h>

int main()
{
  printf("Hi");

  for (;;)
    ;

  return 0;
}

"Hi" не будет напечатан на stdout, так как стандартный поток вывода является буферизованным по умолчанию. Это означает, что вы должны добавить '\n' очистить этот буфер.

#include <stdio.h>

int main()
{
  printf("Hi\n");

  for (;;)
    ;

  return 0;
}

С forkбуферы родительского процесса будут скопированы в дочерний процесс.

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

int main()
{
  printf("Hi");

  /* stdout in the father process contains "Hi" */
  fork();

  /* stdout in the father process contains "Hi" */
  /* stdout in the child process contains "Hi" */

  /* With return statement all buffers are flushed and "Hi" is printed twice */
  return 0;
}

Есть такие буферы:

Полный буфер

Строка буфера

Нет буфера

Когда вы используете printf в терминале. line buffer дефолт. Так что вы можете использовать \n очистить буфер. После очистки буфера вы печатаете только один hi

Когда вы используете printf перенаправить в файл. full buffer дефолт. Таким образом, вы не можете использовать \n очистить буфер. Без очистки буфера вы печатаете два hi

Вы можете использовать setvbuf`для изменения типа буфера.

Другие вопросы по тегам