Допустим, начиная с ядра 2.6.
Я наблюдаю за всеми запущенными процессами в системе.
Всегда ли PID детей больше, чем PID их родителей?
Возможно ли иметь особые случаи «инверсии»?
источник
Допустим, начиная с ядра 2.6.
Я наблюдаю за всеми запущенными процессами в системе.
Всегда ли PID детей больше, чем PID их родителей?
Возможно ли иметь особые случаи «инверсии»?
Нет, по той простой причине, что существует максимальное числовое значение, которое может иметь PID. Если у процесса самый высокий PID, ни у какого дочернего процесса он не может быть с большим PID. Альтернативой тому, чтобы дать ребенку более низкий PID, было бы полное неудача fork()
, что не было бы очень продуктивным.
PID распределяются по порядку, и после использования старшего из них система переходит к повторному использованию (бесплатных) младших, так что вы можете получить более низкие PID для ребенка и в других случаях.
Максимальный PID по умолчанию в моей системе ( /proc/sys/kernel/pid_max
) - всего 32768, поэтому нетрудно достичь условия, когда происходит обход.
$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297
Если бы ваша система выделяла PID случайным образом ( как это делает OpenBSD ), а не последовательно (например, в Linux), было бы два варианта. Либо случайный выбор был сделан по всему пространству возможных PID, и в этом случае было бы очевидно, что PID ребенка может быть ниже, чем родительский. Или PID ребенка будет выбран случайным образом из значений, превышающих PID родителя, что в среднем поместит его на полпути между PID родителя и максимумом. Процессы рекурсивного разветвления затем быстро достигнут максимума, и мы окажемся в той же точке, что и упомянутая выше: новый форк должен будет использовать более низкий PID для успеха.
Также существует вероятность уязвимостей в безопасности с помощью уведомлений ядра и разветвления, чтобы избежать обнаружения при сканировании таблицы процессов; если все сделано правильно, ваш процесс будет иметь более низкий PID, а инструменты процесса не увидят этот процесс.
http://cve.circl.lu/cve/CVE-2018-1121
источник