Справочная информация: Это дополнительный вопрос к этой теме об обработке EINTR для системных вызовов в C ++ (Linux / GCC). Независимо от того, намереваюсь ли я профилировать свое приложение, мне кажется, что я должен обрабатывать системные вызовы, устанавливая errno
в EINTR
как особый случай. Существует много , много , много мнений об использовании goto
.
Мой вопрос: является ли системный вызов настройкой errno
на EINTR
, когда goto
считается номинальным? Если нет, то как бы вы предложили преобразовать следующий код для обработки EINTR
?
if ( ( sock_fd = ::socket( domain, type, protocol ) ) < 0 ) {
throw SocketException( "Socket::Socket() -> ::socket()", errno );
}
Заранее спасибо!
Cheers,
-Крис
ОБНОВЛЕНИЕ: Основываясь на ответах ниже, я написал следующий макрос:
#define SOCK_SYSCALL_TRY(call,error) \
while ( (call) < 0 ) { \
switch ( errno ) { \
case EINTR: \
continue; \
default: \
throw SocketException( (error), errno ); \
} \
} \
Который используется для преобразования моего исходного фрагмента в этот пример:
SOCK_SYSCALL_TRY( sock_fd = ::socket( domain, type, protocol ), "Socket::Socket() -> ::socket()" )
Надеюсь, это поможет кому-то еще!