我们正在使用System V消息队列,并在阻塞模式下调用msgrcv
函数。我们想在阻塞msgrcv
函数上实现一个计时器,这样当计时器到期并且我们没有收到消息时,我们可以解除阻塞msgrcv
并继续执行。
您对我们如何通过编程实现这一目标有什么建议吗?
答案 0 :(得分:2)
我用报警信号解决了这个问题。
如果有帮助,请检查以下程序:
int msg_recv(int id, MSG_DATA *msgptr)
{
int n;
**alarm(2);** //After 2 second msg_recv interrupt and return errno "Interrupted system call"
n = msgrcv(id, (MSG_DATA *) msgptr, sizeof(MSG_DATA) , 0, 0);
perror("Return from msgrcv");
printf ("N = %d\n %d %s\n\n",n,errno,strerror(errno));
if ( n < 0) //goto LOOP; // This forces the interrupted msgrcv to repeat
return(n);
}
void sigalrm_handler()
{
printf("Alarm signal delivered !\n");
return;
}
int main();
int main()
{
//signal (SIGALRM, times_up); /* go to the times_up function */
/* when the alarm goes off. */
**signal(SIGALRM, sigalrm_handler);**
int msqid; /* return value from msgget() */
MSG_DATA msg_data;
msqid = 0;
printf("Ready to receive ... \n");
**msg_recv(msqid, &msg_data);**
printf("read message \n");
return 0;
}
答案 1 :(得分:0)
signal handler有一个int参数:
void sigalrm_handler(int)
{
printf("Alarm signal delivered !\n");
return;
}