如果执行时间过长,我可以中断功能吗?

时间:2012-04-30 23:28:45

标签: c++ signals

我有一个第三方功能,我在我的程序中使用。我无法取代它;它在动态库中,所以我也无法编辑它。问题是它有时会运行太久。

那么,如果它运行超过10秒,我可以做任何事情来阻止这个函数运行吗? (在这种情况下关闭程序是可以的。)

PS。我有Linux,这个程序不必在其他任何地方移植。

我想要的是这样的:

#include <stdio.h>
#include <stdlib.h>

void func1 (void) // I can not change contents of this.
{
  int i; // random
  while (i % 2 == 0);
}

int main ()
{
  setTryTime(10000);
  timeTry{
     func1();
  } catchTime {
     puts("function executed too long, aborting..");
  }

  return 0;
}

3 个答案:

答案 0 :(得分:3)

不确定。而你只是按照你在标题中建议的方式来做:“信号”。

具体来说,是一个“警报”信号:

答案 1 :(得分:3)

如果你真的必须这样做,你可能想要产生一个除了调用该函数并将其结果返回给调用者之外什么都不做的进程。如果运行时间过长,您可以终止该过程。

通过把它放到自己的过程中,你有一个体面的(不是很好但很体面的)清理至少它正在做的事情的机会,所以当它意外地死掉它可能赢了把事情弄得一团糟,这会导致以后的问题。

答案 2 :(得分:0)

强制取消正在运行的函数的潜在问题是它可能“拥有”它打算稍后返回的资源。可能存在问题的资源包括:

  • 堆内存分配(免费存储)
  • 共享内存段
  • 线程
  • 插座
  • 文件句柄

其中一些资源是基于每个进程管理的,因此让函数在不同的进程中运行(可能使用fork)可以更容易地彻底杀死它。其他资源可以比流程更长,并且必须明确地清理。根据您的操作系统,该功能也可能通过与某些硬件驱动程序或设备进行交互而中途运行,并且意外杀死该功能可能会使该驱动程序或设备处于奇怪的状态,以至于在该状态之后它将无法工作。重新启动。

如果您碰巧知道该函数不使用任何这类资源,那么您可以自信地杀死它。但是,很难保证:在具有许多此类决策的大型系统中 - 编译器无法检查 - 像func1()这样的函数中的代码演变可能会引入对这些资源的依赖。

如果你必须这样做,我建议在不同的进程或线程中运行它,并使用kill()进行进程,pthread_kill如果func1()支持在标志为时终止如果没有其他选择,则设置为异步,或者为非可移植pthread_cancel