如何限制C / POSIX中函数的执行时间?

与此问题类似,我想在C中限制函数的执行时间 – 最好是微秒精度。我想C ++exception可用于实现类似于此 Python解决方案的结果。 虽然它并不理想,但这种方法在普通C中完全不可用。

那么,我想知道如何在Posix系统上的C中经过一定的时间间隔后中断函数的执行? 对于相对简单的情况,一些愚蠢的业务工作得很好,但这增加了与问题解决方案正交的大量代码。 假设我有这样的函数:

void boil(egg *e) { while (true) do_boil(e); } 

我想在鸡蛋上运行煮沸*,每50μs打断一次,检查一下这样做:

egg *e = init_egg(); while (true) { preempt_in(50, (void) (*boil), 1, e); /* Now boil(e) is executed for 50μs, then control flow is returned to the statement prior to the call to preempt_in. */ if (e->cooked_val > 100) break; } 

我意识到pthreads可以用来做到这一点,但我更感兴趣的是避免使用它们。 我可以在SIGALRM处理程序中切换ucontext_t,但POSIX标准指出不能在信号处理程序中使用setcontext / swapcontext,实际上,我注意到Linux和Solaris系统之间的行为不同。

这种效果有可能实现吗? 如果是这样,以便携方式?

请注意,您在这里寻找的一般function称为成本执行 。 例如,见Wellings或Leung等人的这篇文章。 al。的好书 。 上面的答案侧重于在用户空间中实现它; 一些RTOS或语言支持它(不是linux)作为一般机制。

提供此function的一个示例OS是AUTOSAR OS(规范链接) 。 请注意,此操作系统提供执行时间实施 ,这与截止日期强制执行略有不同 执行时间执行越来越难,因为它依赖于某些能力来衡量实际花费的成本(通常是硬件合作)。 由于当今处理器的复杂性,测量它的难度和成本很高 – 更不用说测量的意义(由于非线性执行和各种其他很酷的东西)很难解释 – 因此很难计算(代码执行时间的特定部分的最坏或常见情况估计。

稍微偏离主题,但Ada在语言级别提供了更严格的function集,这对您没有帮助,但您可以弄清楚这些Ada要求是如何在Linux中实现的。 Ada语言规范在提供基本原理文档时是独一无二的,请参阅实时抢占中止部分作为出发点。

您既可以使用线程,也可以让函数轮询一个计时器(或SIGALRM处理程序设置的全局变量),然后保存其状态并在分配的时间到期后退出。 不推荐使用ucontext_t根本不应该在新代码中使用,更不用说信号处理程序了。

我想要的解决方案突然发生在我身上:转到! 我将在我希望限制的函数之后设置一个跳转点,设置一个定时器,并在处理SIG * ALRM的信号处理程序中简单地跳转到函数后面的指令。