Linux — В C ++, fork и kill не убивают все дочерние процессы

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

     pid_t pid;
pid=fork();
if (pid == 0)
{
//In child
execl("/bin/sh", "sh", "-c", "/opt/qcom/bin/version.out > /tmp/version", (char *)NULL);
exit(0);
}
else
{
// In parent, wait for 1 second
sleep(1);
int status;
if (waitpid(pid, &status, WNOHANG) != pid)
{
//kill(pid, SIGTERM); //--> tried this too
kill(pid, SIGKILL);
}
fsmverDir("/tmp/version");
system("rm /tmp/version");
}

Но это не убийство полностью, Я вижу ниже вывод ps после запуска моей программы 3 раза (она создала 3 version.out’s), и «sh» отображается как зомби …

# ps | grep "version.out\|sh"2012 root         0 Z    [sh]
2013 root     13236 S    /opt/qcom/bin/version.out
2058 root         0 Z    [sh]
2059 root     13236 S    /opt/qcom/bin/version.out
2092 root         0 Z    [sh]
2093 root     13236 S    /opt/qcom/bin/version.out
2100 root      2360 S    grep version.out\|sh
#

Или есть ли способ запустить команду с таймаутом в busybox Linux?
Что-то вроде:

execlp("timeout","timeout","1","sh","-c","/opt/qcom/bin/version.out > /tmp/version",NULL);

В моей версии busybox нет времени ожидания, есть ли альтернатива?

1

Решение

Вы создаете оболочку (дочернюю), которая в свою очередь запускает «version.out» (внука).

Вы убиваете ребенка, тем самым превращая его в зомби и осиротев внука. Вы можете забрать ребенка, позвонив wait во второй раз (он вычеркнул ошибку в первый раз, иначе вы бы никогда не позвонили kill) но вы все равно не достигнете цели убийства внука от родителей.

2

Другие решения

Других решений пока нет …