首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System V IPC msgrcv,带定时器Howto

System V IPC msgrcv,带定时器Howto
EN

Stack Overflow用户
提问于 2010-12-14 15:25:40
回答 2查看 3.5K关注 0票数 0

我们使用一个System V消息队列,其中msgrcv函数在阻塞模式下被调用。我们希望在阻塞msgrcv函数上实现一个计时器,这样当计时器超时并且我们没有收到消息时,我们可以解除阻塞msgrcv并继续执行。

关于如何通过编程实现这一点,您有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2011-01-21 15:09:56

我已经用报警信号解决了这个问题。

如果有帮助,请检查以下程序:

代码语言:javascript
复制
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;                               
}
票数 2
EN

Stack Overflow用户

发布于 2017-09-20 21:27:16

信号处理程序有一个int参数:

代码语言:javascript
复制
void sigalrm_handler(int)
{
    printf("Alarm signal delivered !\n");
    return;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4436814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档