Использовать waitpid для дочернего элемента с идентификатором группы 1

Насколько я знаю, не с API ядра. Если бы такой интерфейс существовал, он должен был бы быть ограничен суперпользователем -, иначе это позволило бы любому получить доступ к файлам в каталогах, к которым у него нет доступа для поиска.

Но вы можете использовать debugfsв файловой системе (после ее размонтирования ), чтобы сделать это (, предполагая, что у вас есть доступ для записи к блочному устройству ).

debugfs -w /dev/block/device

(замените/dev/block/deviceфактическим блочным устройством, в котором находится файловая система ).

Затем в ответ на приглашение debugfsвведите

stat <123>
(с угловыми скобками, заменив 123 фактическим номером индекса )для проверки существования файла (индекс имеет счетчик ссылок больше 0 )и не является каталогом.

Если все хорошо, введите:

ln <123> path/to/newfile
для создания жесткой ссылки (обратите внимание, что путь указан относительно корня файловой системы ). Вслед за :

mi <123>
для увеличения количества ссылок (нажмите Введите для всех полей, кроме счетчика ссылок, где вы хотите добавить 1 к текущему значению ).
0
07.10.2018, 12:07
2 ответа

Вы можете только ждать детей от вашего процесса.

Если дочерний процесс меняет свой идентификатор группы процессов, новый идентификатор группы процессов может использоваться как отрицательное число с waitpid().

Кстати, :функция waitpid()устарела с 1989 года. Современная функция — :waitid(), и она поддерживает то, что вам нравится:

waitid(idtype, id, infop, opts) 
    idtype_t        idtype; 
    id_t            id; 
    siginfo_t       *infop;         /* Must be != NULL */ 
    int             opts; 

Если вы хотите дождаться группы процессов, используйте:

waitid(P_PGID, pgid, infop, opts);

Итак, если у вас действительно есть процесс в группе процессов с идентификатором 1, вызовите:

waitid(P_PGID, 1, infop, opts);

Но поскольку initуже использует этот идентификатор группы процессов, вам нужно быть процессом init, чтобы иметь возможность иметь дочерние элементы под pgid 1.

Это, однако, не будет работать, если вы работаете на платформе, которая реализует waitid()не как системный вызов, а как эмуляцию поверх устаревшего waitpid().

Преимущества waitid()::

  • позволяет четко указать, чего ждать (, например. P _PID P _PGID P _ВСЕ)

  • возвращает все 32 бита из параметра exit(2)в дочернем процессе обратно в родительский процесс.

  • позволяет ждать с флагом :WNOWAIT, который не собирает дочерний процесс и сохраняет его для дальнейшего использования в таблице процессов.

BTW :Указатель siginfo _t в waitid()идентичен второму параметру функции обработчика сигнала для SIGCHLD.

0
28.01.2020, 04:19

У вас могут возникнуть проблемы с ситуацией, когда идентификатор группы процессов дочернего процесса равен 1.

Группы процессов в основном предназначены для оболочек, выполняющих приоритетные и фоновые процессы (конвейеры ). Обычно, когда запускается новая группа процессов, она получает идентификатор группы процессов из идентификатора первого процесса. У вас не будет ребенка с PID 1, поэтому вы не получите ребенка и с PGID 1.

Вызов setpgid()позволяет переместить процесс из одной группы процессов в другую, но они по-прежнему должны быть частью одного и того же сеанса (входа в систему ), поэтому вы не можете переместить процесс в PGID 1, который так или иначе.

Если у вас есть оболочка, работающая как PID 1, она также может иметь PGID 1. Но пока оболочка меняет PGID своих потомков, у них будет другой PGID.

0
28.01.2020, 04:19

Теги

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