fork() и printf()

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

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

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

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

Например:

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

parent: printf("Hello");

child: printf("World\n");

Console has: HeWollorld

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

parent: printf("Hello");

child: printf("World\n");

Console has: HelolWorld

person Art Spasky    schedule 25.01.2010    source источник


Ответы (3)


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

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

person Alok Singhal    schedule 25.01.2010
comment
Он не пишет в трубу, он (скорее всего) пишет в терминал. Таким образом, даже запросы на запись меньше PIPE_BUF не гарантируют атомарность. - person David Schwartz; 02.10.2011

stdout обычно буферизуется строкой. stderr обычно не буферизуется.

person Ignacio Vazquez-Abrams    schedule 25.01.2010

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

person Itay Maman    schedule 25.01.2010