是否有办法调用某个功能,如果响应时间过长,是否可以取消或跳过该功能?
我正在模拟ftp连接,并且我正在使用此函数调用从服务器接收响应:
status = receiveMessage(ccSocket, replyMsg, sizeof(replyMsg), &msgSize);
有没有办法等待,比方说,5秒,如果还没有响应,可以跳过函数调用吗?
答案 0 :(得分:5)
您可以使用许多不同的方法来解决此问题。
答案 1 :(得分:1)
取决于功能以及对它的控制程度。
如果recv
来电,您可以使用setsocketopt
和SO_RCVTIMEO
来设置超时。在这种情况下,函数调用将返回EAGAIN
或EWOULDBLOCK
。
或者,您可以中断recv
来电 - How to cleanly interrupt a thread blocking on a recv call?
在更多通用案例中,您可以启动并行线程,并让它们都保持对布尔值的引用,该值将标记超时是否已过期。执行该工作的原始线程需要定期检查它,另一个将在超时过后标记它。如果函数调用在超时之前完成,那么关闭帮助程序将是主线程的责任。
在伪代码中它看起来像这样:
shared mutable state:
job_to_do = true
timeout_happened = false
main thread:
pthread_create(helper, ...)
/* we depend on the fact that 'job_to_do' will be set to false when there's nothing more to process */
while (job_to_do && !timeout_happened) {
process_more_for_some_time /* this obviously has to take less time than timeout */
}
if (job_to_do) {
perror("timeout")
}
helper thread:
time_passed = 0
while (job_to_do && time_passed < timeout) {
sleep(sample)
time_passed += sample
}
/* there's no point in signalling timeout if the job has finished */
if (job_to_do)
timeout_happened = true
实施细节:job_to_do
和timeout_happened
必须是原子/可见的,因为您可能是从不同的核心访问变量。
答案 2 :(得分:1)
您可以检查系统中是否有看门狗并使用它
设置每3秒调用一次定时器中断并在其处理程序中设置全局变量STOP=true
放了if (STOP) exit(1)
。