Дочерний процесс убивает себя, но становится зомби

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

Поскольку единственная копия такого непостоянного ключа -в ОЗУ будет активно обнуляться в рамках нормального завершения работы после закрытия криптоустройства, любые попытки восстановить ключ из содержимого ОЗУ после полного отключения будут также быть бесполезным.

Тот факт, что ваш crypttabвключает опцию swap, предполагает, что эта схема может использоваться :опция swapзаставляет cryptsetupзапускать mkswapна /dev/mapper/swap_cryptпосле инициализации шифрования, это было бы необходимо только в том случае, если бы существующее содержимое раздела подкачки было нечитаемой тарабарщиной... т.е. зашифровано другим постоянным ключом, отличным от -.

При использовании системы инициализации systemdпараметр keyscript=может быть проигнорирован, и вместо него будет использоваться помощник cryptsetup systemd, в зависимости от выбора, сделанного вашим дистрибутивом Linux. Подробнее см. man systemd-cryptsetup-generatorи man systemd-cryptsetup@.service.

0
20.09.2019, 23:42
1 ответ

Вам нужно будет получить дочерний процесс от родительского. См. wait(2). Кажется, что происходит то, что вы просто обрабатываете случай, когда выполняется код дочернего процесса, и просто игнорируете результат в родительском. В результате родитель не выполняет никакой очистки после выхода дочернего элемента, и в результате происходит утечка PID.

Самое простое решение — добавить к условию ifследующий elseслучай.

else if (pid > 0) {
    int status;
    waitpid(pid, &status, 0);
}

РЕДАКТИРОВАТЬ:Приведенное выше условие блокирует родительский процесс до завершения дочернего процесса. При выходе потомка сигнал SIGCHLDотправляется родителю, и по умолчанию он игнорируется. Однако, согласно POSIX.1 -2001, если вы явно установите обработчик сигнала для SIGCHLDна SIG_IGN, тогда система автоматически очистит дочерний процесс с оговоркой, что родительский процесс ничего не знает о выходной статус ребенка.

В функцию инициализации добавьте следующий код:

signal(SIGCHLD, SIG_IGN);
0
28.01.2020, 03:16

Теги

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