Ошибка Yum: Требуются установленные пакеты.

Вызов 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
...
1
11.06.2017, 15:38
1 ответ

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.

0
28.01.2020, 00:55

Теги

Похожие вопросы