System V IPC msgrcv с таймером Howto - PullRequest
       31

System V IPC msgrcv с таймером Howto

0 голосов
/ 14 декабря 2010

Мы используем очередь сообщений System V с функцией msgrcv, вызываемой в режиме блокировки. Мы хотим реализовать таймер для функции блокировки msgrcv, чтобы по истечении таймера и при отсутствии сообщения мы могли разблокировать msgrcv и продолжить выполнение.

Есть ли у вас какие-либо предложения о том, как мы можем достичь этого путем программирования?

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Я решил эту проблему с помощью сигнала тревоги.

Пожалуйста, проверьте следующую программу, если она помогает:

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;                               
}
0 голосов
/ 20 сентября 2017
Обработчик сигнала

имеет параметр типа int:

void sigalrm_handler(int)
{
    printf("Alarm signal delivered !\n");
    return;
}
...