Системный вызов write
является атомным ; то есть все это происходит одновременно. Нет возможности для чередования строк. Если вы сделаете вызов write
из нескольких частей (например, напишите строку "Hi from "
, а затем напишите строку "parent"
или "child"
, а затем напишите новую строку), то вы, вероятно, увидите чередование , Когда вы write
целое сообщение в виде одной строки, это никогда не произойдет.
Обратите внимание, что вызовы более высокого уровня, такие как printf
или аналогичные, имеют более сложные правила буферизации и, следовательно, могут иметь другие правила.
В ответ на дополнительный вопрос о том, почему две родительские строки всегда располагаются перед двумя дочерними, это не совсем удача, но и не гарантируется. В той же системе с теми же настройками, я ожидал бы, что это будет в основном согласованно, запланировал ли он сначала родителя или потомка, но другие платформы могут принять противоположное решение.
Что касается того, почему он никогда не печатает одну строку из родительского, затем одну строку из дочернего, затем вторую строку из родительского, я бы предположил, что это связано со спецификой планировщика и записи в виртуальный терминал , Переключение контекста с одного процесса на другой стоит дорого; если write
достаточно быстр, планировщик может сказать, что не должен этого делать. Возможно, если вы вместо этого записали на диск и позвонили sync
между write
s, чтобы убедиться, что (относительно медленный) диск действительно был задействован, он с большей вероятностью будет чередоваться. Или, возможно, нет; это действительно трудно предсказать. Если вы действительно хотите увидеть чередование, я бы написал по крайней мере несколько килобайт, по несколько раз, от родителя и ребенка; это было бы близко к определенному чередованию.