msgrcv
ブロッキング モードで関数が呼び出されるSystem V メッセージ キューを使用しています。ブロッキングmsgrcv
関数にタイマーを実装して、タイマーが期限切れになり、メッセージを受信していない場合に、ブロックを解除msgrcv
して実行を継続できるようにします。
プログラミングによってこれを達成する方法について何か提案はありますか?
msgrcv
ブロッキング モードで関数が呼び出されるSystem V メッセージ キューを使用しています。ブロッキングmsgrcv
関数にタイマーを実装して、タイマーが期限切れになり、メッセージを受信していない場合に、ブロックを解除msgrcv
して実行を継続できるようにします。
プログラミングによってこれを達成する方法について何か提案はありますか?
アラーム信号を使用してこの問題を解決しました。
役立つ場合は、次のプログラムを確認してください。
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;
}