Насколько я знаю, не с API ядра. Если бы такой интерфейс существовал, он должен был бы быть ограничен суперпользователем -, иначе это позволило бы любому получить доступ к файлам в каталогах, к которым у него нет доступа для поиска.
Но вы можете использовать debugfs
в файловой системе (после ее размонтирования ), чтобы сделать это (, предполагая, что у вас есть доступ для записи к блочному устройству ).
debugfs -w /dev/block/device
(замените/dev/block/device
фактическим блочным устройством, в котором находится файловая система ).
Затем в ответ на приглашение debugfs
введите
stat <123>(с угловыми скобками, заменив 123 фактическим номером индекса )для проверки существования файла (индекс имеет счетчик ссылок больше 0 )и не является каталогом.
Если все хорошо, введите:
ln <123> path/to/newfileдля создания жесткой ссылки (обратите внимание, что путь указан относительно корня файловой системы ). Вслед за :
mi <123>для увеличения количества ссылок (нажмите Введите для всех полей, кроме счетчика ссылок, где вы хотите добавить 1 к текущему значению ).
Вы можете только ждать детей от вашего процесса.
Если дочерний процесс меняет свой идентификатор группы процессов, новый идентификатор группы процессов может использоваться как отрицательное число с 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
.
У вас могут возникнуть проблемы с ситуацией, когда идентификатор группы процессов дочернего процесса равен 1
.
Группы процессов в основном предназначены для оболочек, выполняющих приоритетные и фоновые процессы (конвейеры ). Обычно, когда запускается новая группа процессов, она получает идентификатор группы процессов из идентификатора первого процесса. У вас не будет ребенка с PID 1, поэтому вы не получите ребенка и с PGID 1.
Вызов setpgid()
позволяет переместить процесс из одной группы процессов в другую, но они по-прежнему должны быть частью одного и того же сеанса (входа в систему ), поэтому вы не можете переместить процесс в PGID 1, который так или иначе.
Если у вас есть оболочка, работающая как PID 1, она также может иметь PGID 1. Но пока оболочка меняет PGID своих потомков, у них будет другой PGID.