Вызов printf
будет запускать один или несколько системных вызовов write (2)
, и порядок их обработки будет фактическим порядком выполнения вывод. Один или несколько, потому что это зависит от буферизации внутри библиотеки C. При выводе с буферизацией строки (идущем на терминал) вы, скорее всего, получите два вызова write
, один раз для начальной новой строки, а другой - для остальных.
write(1, "\n", 1);
write(1, " 1234567890 \n", 13);
Между вызовами можно запланировать другой процесс, что даст сначала две пустые строки, затем строки с цифрами, но, учитывая, что обработки не так много, это маловероятно в незагруженной системе.
Обратите внимание: поскольку оба процесса печатают одно и то же, не имеет значения, какой из них выполняется первым, если только один не прерывает другой.
Если вывод поступает в файл или канал, по умолчанию он полностью буферизован, поэтому вы, вероятно, получите только один вызов write
(для каждого процесса), и никакой возможности смешанного вывод.
Ваш пример смешанных цифр был бы возможен, если бы цифры выводились одна за другой с отдельными системными вызовами. Трудно понять, почему разумная реализация библиотеки будет делать это при печати статической строки, длина которой известна. Чем больше записей в цикле, тем вероятнее будет смешанный вывод:
Что-то вроде этого:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i;
setbuf(stdout, NULL); /* explicitly unbuffered */
int x = fork();
for (i = 0 ; i < 500 ; i++) {
printf("%d", !!x);
}
if (x) {
wait(NULL);
printf("\n");
}
return 0;
}
Дает мне вывод, как показано ниже. В большинстве случаев, но не всегда. Система должна решить, как планировать процессы. Непредсказуемость - вот почему мы обычно стараемся избегать условий гонки.
111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111
111100000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000010000001001100
110000000011001100110011000000010011001100110000000100110011001100000001001
100110011000000010011001100110000000100110011001100000001001100110011000000
...
cpp-4.8.5-11 — это версия, поставляемая с RHEL 7.3, но cpp-4.8.5-14 поставляется с RHEL 7.4 (который, я думаю, все еще находится в стадии бета-тестирования). «Установлено: cpp-4.8.5-14.el7.x86_64 (скрыто) указывает, что установленная версия является пакетом RHEL 7.4.
Итак, я предполагаю, что вы использовали установочный носитель для RHEL 7.4, но репозиторий, который вы подключаете имеет пакеты RHEL 7.3. Если это проблема, вам нужно настроить файл репо в /etc/yum.repos.d для репозитория RHEL 7.4.
Один из вариантов — скопировать ISO для используемого вами установочного носителя. в вашу систему и настроить его как локальный репозиторий, пока в вашей сети не появится репозиторий RHEL 7.4.