fork () и printf () - PullRequest
       34

fork () и printf ()

1 голос
/ 25 января 2010

Как я понял, fork () создает дочерний процесс путем копирования образа родительского процесса.

Мой вопрос о том, как дочерние и родительские процессы совместно используют поток stdout?

Может лиФункция printf () одного процесса прерывается другим или нет?Что может привести к смешанному выводу.

Или функция вывода printf () атомарна?

Например:

Первый случай:

parent: printf("Hello");

child: printf("World\n");

Console has: HeWollorld

Второй случай:

parent: printf("Hello");

child: printf("World\n");

Console has: HelolWorld

Ответы [ 3 ]

4 голосов
/ 25 января 2010

printf() не гарантированно будет атомарным. Если вам нужна атомарность, используйте write() со строкой, предварительно отформатированный с использованием s*printf() и т. Д., Если необходимо. Даже тогда вы должны сделать размер данных, записанных с использованием write(), равным , не слишком большим :

Запросы на запись размером {PIPE_BUF} байт или меньше не должны чередоваться с данными из других процессов, выполняющих запись в том же канале. При записи размером более {PIPE_BUF} байтов данные могут быть чередованы на произвольных границах с записью другими процессами независимо от того, установлен флаг O_NONBLOCK флагов состояния файла.

1 голос
/ 25 января 2010

стандартный вывод обычно буферизуется в строке. У stderr обычно нет буфера.

0 голосов
/ 25 января 2010

Поведение printf () может отличаться (в зависимости от точных деталей вашей ОС, компилятора C и т. Д.). Однако в общем случае printf () не является атомарным. Таким образом, чередование (согласно вашему первому случаю) может произойти

...