Я использую следующие системные вызовы в своей программе:
recvfrom
sendto
sendmsg
И из каждого упомянутого выше системного вызова я проверяю, завершается ли он без прерывания, и в случае, если он прерван, я повторяю попытку.
Ex:
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.
Я не могу проверить это сейчас, так как у меня нет доступа к настройке сервер-клиент. Есть идеи?
Спасибо