プログラムで次のシステムコールを使用しています。
recvfrom
sendto
sendmsg
そして、上記の各システムコールから、中断することなく完了するかどうかを確認し、中断された場合は再試行します。
元:
recvagain:
len = recvfrom(fd, response, MSGSIZE, MSG_WAITALL, (struct sockaddr *)&from, &fromlen);
if (errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted: %s", strerror(errno));
goto recvagain;
}
ここでの問題は、失敗するたびにerrno値を0にリセットする必要があるということです。または、recvfrom()が成功した場合、errnoを0にリセットしますか?
recvfrom()のマニュアルページには次のように書かれています。
正常に完了すると、recvfrom()はメッセージの長さをバイト単位で返します。受信可能なメッセージがなく、ピアが正常なシャットダウンを実行した場合、recvfrom()は0を返します。それ以外の場合、関数は-1を返し、エラーを示すためにerrnoを設定します。
sendtoとsendmsgの場合も同じです。
サーバークライアントのセットアップにアクセスできないため、これを実際に確認することはできません。何か案が?
ありがとう