2010-01-25 3 views
1

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

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

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

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

Например:

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

parent: printf("Hello"); 

child: printf("World\n"); 

Console has: HeWollorld 

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

parent: printf("Hello"); 

child: printf("World\n"); 

Console has: HelolWorld 

ответ

4

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

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

+1

Он не пишет трубку, он (скорее всего) пишет на терминал. Таким образом, даже запросы на запись, меньшие, чем PIPE_BUF, не гарантируются атомом. –

0

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

1

stdout обычно буферизируется по строке. stderr обычно не загружается.