Ниже приведен код, который выполняет двоичный файл в дочернем процессе, подождите 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 нет времени ожидания, есть ли альтернатива?
Вы создаете оболочку (дочернюю), которая в свою очередь запускает «version.out» (внука).
Вы убиваете ребенка, тем самым превращая его в зомби и осиротев внука. Вы можете забрать ребенка, позвонив wait
во второй раз (он вычеркнул ошибку в первый раз, иначе вы бы никогда не позвонили kill
) но вы все равно не достигнете цели убийства внука от родителей.
Других решений пока нет …