Неожиданный вывод 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`для изменения типа буфера.