GLibC有一个方法semtimedop,它允许你执行一个操作(在这种情况下是一个信号量获取),它在一定时间后超时. Win32还提供了WaitForSingleObject,它提供了类似的功能.
据我所知,在OSX或其他Unices上没有相应的东西.你能否建议semtimedop的等价物或者在一定时间后干净地终止semop的解决方法.
最佳答案 您可以通过获取信号(例如由alarm()引起的信号)来中断semop()调用(以及大多数其他阻塞调用).
未经测试的例子:
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
volatile int alarm_triggered = 0;
void alarm_handler(int sig)
{
alarm_triggered = 1;
}
int main(int argc, char **argv)
{
int rc;
/* set up signal handler */
signal(SIGALRM, alarm_handler);
/* ... */
alarm(30); /* 30 second timeout */
rc = semop(...);
if (rc == -1 && errno == EINTR)
{
if (alarm_triggered)
{
/* timed out! */
}
}
alarm(0); /* disable alarm */
/* ... */
}