我有一个程序,我ssh到服务器并获取数据。这里是代码…我fork它,子进程执行查询,父进程等待子进程一段预定的时间(在函数超时中),然后杀死子进程。我做了那部分,因为有时,我不完全确定为什么,但ssh连接停止,不退出。也就是说,在进程列表中有一个"ssh -oConnectTimeout=60 blah blah"很长一段时间,超时函数似乎不起作用。我哪里做错了?上次这个问题发生时,有一个ssh在进程列表5天,仍然没有超时,程序已经停止,因为它正在等待子进程。有那些额外的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;
}
SIGTERM只是要求礼貌地终止该过程。如果它卡住了,那么它将不会响应,您需要使用SIGKILL来终止它。可能在尝试SIGTERM并等待一段时间之后。
另一种可能是它正在等待到父进程的输出管道未满-可能有足够的输出填充缓冲区,并且子进程正在等待该输出而不是网络。