У меня есть программа, где я ssh на сервер и получает данные. Вот код ... Я его разветвляю, и потомок выполняет запрос, и родитель ждет потомка в течение заранее определенного промежутка времени (в функции timeout), а затем убивает потомка. Я сделал эту часть, потому что иногда я не совсем уверен, почему, но соединение ssh останавливается и не завершается. То есть в списке процессов долгое время есть «ssh -oConnectTimeout = 60 бла-бла», и функция тайм-аута, похоже, не работает. Что я здесь не так делаю? В прошлый раз, когда возникла эта проблема, в течение 5 дней в списке процессов был ssh, но время ожидания не истекло, и программа остановилась, поскольку ожидала ребенка. Есть те дополнительные функции wait (), потому что раньше я получал много несуществующих процессов, например, зомби. Так что я выбрал легкий путь ..
c = fork();
if(c==0) {
close(fd[READ]);
if (dup2(fd[WRITE],STDOUT_FILENO) != -1)
execlp("ssh", "ssh -oConnectTimeout=60", serverDetails.c_str(), NULL);
_exit(1);
}else{
if(timeout(c) == 1){
kill(c,SIGTERM);
waitpid(c, &exitStatus, WNOHANG);
wait(&exitStatus);
return 0;
}
wait(&exitStatus);
}
Это функция тайм-аута.
int timeout(int childPID)
{
int times = 0, max_times = 10, status, rc;
while (times < max_times){
sleep(5);
rc = waitpid(childPID, &status, WNOHANG);
if(rc < 0){
perror("waitpid");
exit(1);
}
if(WIFEXITED(status) || WIFSIGNALED(status)){
/* child exits */
break;
}
times++;
}
if (times >= max_times){
return 1;
}
else return 0;
}