を使用して、タイムアウトをrecvfrom
に設定します。しかし、signal()
を使用してSIGALRM
のハンドラを登録すると、SIGALRM
が取得され、その後シグナルハンドラが呼び出されることが判明しました。しかし、ハンドラから返された後には、recvfrom()
はまだブロックしている間にデータが来ず、EINTR
エラーがありません。どうして? signal()
は自動的にSA_RESTART
フラグを設定していますか?ここ はコードです:ブロッキング・コールが再起動されているかどうかSIGALRMがキャプチャされたときにrecvfrom()がまだブロックされていますか?
signal(SIGALRM, sig_handler);
while(1)
{
alarm(5);
n = recvfrom(sock, buf, BUF_MAX, 0, (struct sockaddr*)&addr, &len);
if(n < 0)
{
if(errno == EINTR)
{
printf("recvfrom timeout\n");
continue;
}
else
{
printf("recvfrom error\n");
}
}
else
{
printf("data: %s\n", buf);
alarm(0);
}
}
void sig_handler(int signo)
{
return;
}
実際の質問は、なぜSO_RCVTIMEOを使用していないのですか? – EJP