我有一个程序,我可以在服务器中获取数据。这是代码...我把它分叉,孩子执行查询,父母等待孩子一段预定的时间(在函数超时),然后杀死孩子。我做了那个部分,因为有时,我不确定为什么,但ssh连接停止并且不退出。也就是说,在进程列表中有一个“ssh -oConnectTimeout = 60 blah blah”,并且超时函数似乎不起作用。我在这做错了什么?上次出现此问题时,进程列表中有一个ssh持续5天仍然没有超时,程序已经停止,因为它正在等待孩子。还有那些额外的wait()函数,因为之前我得到了很多已经失效的进程a.k.a僵尸。所以我采取了简单的方法..
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;
}
答案 0 :(得分:0)
SIGTERM只是要求礼貌地终止该过程。如果它被卡住,那么它将不会响应,你需要使用SIGKILL来杀死它。可能在尝试SIGTERM并等待一段时间之后。
另一种可能性是它正在等待父进程的输出管道不满 - 也许有足够的输出来填充缓冲区,而且孩子正在等待而不是网络。