2010-12-14 2 views
0

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

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

+0

возможный дубликат http://stackoverflow.com/questions/4110198/system- v-сообщение-очередь приуроченная-прием – jschmier

ответ

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;        
} 
0

обработчик сигнала имеет Int параметров:

void sigalrm_handler(int) 
{ 
    printf("Alarm signal delivered !\n"); 
    return; 
} 
Смежные вопросы