Вам нужно будет получить дочерний процесс от родительского. См. 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);
Чтобы увеличить шансы на восстановление данных с этого диска, немедленно прекратите его использование. Размонтируйте его сейчас. Когда ваш новый диск прибудет, загрузите простой дистрибутив Linux в командной строке и ddrescue старый диск на новый, как описано здесь . Помните :не монтируйте никакие файловые системы со старого диска, чтобы избежать дальнейшего повреждения.
Что касается вашего вопроса об «исправлении» его форматированием --, такого понятия нет. Когда диск умирает, его уже не исправить. Да, вы можете продолжать «использовать» его, но я не понимаю, как вы можете доверять ему свои данные. Возможно, вы могли бы использовать его как подставку для пива.