3

我有我在我的程序中使用的第三方功能。我无法替换它;它在动态库中,所以我也无法编辑它。问题是它有时运行时间过长。

那么,例如,如果它运行超过 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;
}
4

3 回答 3

3

当然。你会按照你在标题中建议的方式去做:“信号”。

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

于 2012-04-30T23:32:15.927 回答
3

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

通过将其放入自己的过程中,您有一个不错的(不是很好,但不错)的机会来清理至少大部分它正在做的事情,所以当它意外死亡时,它可能不会把事情弄得一团糟,这会导致到以后的问题。

于 2012-04-30T23:41:40.160 回答
0

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

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

其中一些资源是在每个进程的基础上管理的,因此让函数在不同的进程中运行(可能使用fork)更容易干净地杀死。其他资源可能比进程寿命更长,并且确实必须明确清理。根据您的操作系统,该功能也可能是通过与某些硬件驱动程序或设备交互的部分方式,并且意外终止它可能会使该驱动程序或设备处于奇怪的状态,以至于它直到之后才会工作重新开始。

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

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

于 2012-05-01T01:58:22.130 回答