Ich möchte alarm()
verwenden, um das Timeout von recvfrom
festzulegen. Aber festgestellt, dass, wenn signal()
verwenden, um einen Handler für SIGALRM
zu registrieren, und eine SIGALRM
wurde erfasst und dann den Signalhandler aufgerufen. Aber nach der Rückkehr von Handler, blockiert die recvfrom()
immer noch, während keine Daten kommen und es keine EINTR
Fehler gibt. Warum? Setzt das signal()
das SA_RESTART
Flag automatisch? Hier ist der Code:Warum recvfrom() blockiert immer noch, wenn ein SIGALRM erfasst wurde?
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;
}
Die eigentliche Frage ist, warum verwenden Sie nicht SO_RCVTIMEO? – EJP