【问题标题】:How to cancel a function call if it takes too long to respond in C?如果在 C 中响应时间过长,如何取消函数调用?
【发布时间】:2018-04-09 11:57:05
【问题描述】:

有没有办法调用一个函数,然后如果响应时间过长就取消或跳过调用?

我正在模拟一个 ftp 连接,并且我正在使用此函数调用从服务器接收响应:

status = receiveMessage(ccSocket, replyMsg, sizeof(replyMsg), &msgSize);

有没有办法等待,比如说,5 秒,如果函数调用还没有响应,则跳过它?

【问题讨论】:

标签: c server ftp client


【解决方案1】:

您可以使用许多不同的方法来解决此问题。

  1. 使用“选择”调用,允许您的系统检查是否有可用数据,使用给定的超时,如果需要很长时间,您可以取消检查。
  2. 异步设计使您能够“监视”一个套接字,而不必在该套接字上“等待”,这意味着您的进程只有在知道数据可用时才会运行 3
  3. 非阻塞设计允许您出于多种不同原因使用您的处理器,其中套接字上的通信不应阻止您的处理器,类似于异步通信的一种方式,但有一点点变化

【讨论】:

    【解决方案2】:
    1. 您可以检查系统中是否有看门狗并使用它

    2. 设置一个定时器中断,每 3 秒调用一次,并在其处理程序中设置一个全局变量 STOP=true

    3. 在你的大代码中输入if (STOP) exit(1)

    【讨论】:

      【解决方案3】:

      取决于一个函数以及你对它的控制程度。

      recv 调用的情况下,您可以使用setsocketoptSO_RCVTIMEO 来设置超时。在这种情况下,函数调用将返回 EAGAINEWOULDBLOCK

      或者,您可以中断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_dotimeout_happened 必须是原子的/可见的,例如你可以是从不同的核心访问变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多