背景:这是该线程关于在 C++ (Linux/GCC) 中处理系统调用的 EINTR的后续问题。无论我是否打算分析我的应用程序,似乎我都应该将系统调用设置errno
为EINTR
一种特殊情况。关于使用的意见有很多很多很多。goto
我的问题:系统调用设置errno
是否适用于被认为是名义上EINTR
的情况?goto
如果不是,那么您建议如何将以下代码转换为处理EINTR
?
if ( ( sock_fd = ::socket( domain, type, protocol ) ) < 0 ) {
throw SocketException( "Socket::Socket() -> ::socket()", errno );
}
提前致谢!
干杯,
-克里斯
更新:根据以下答案,我最终编写了以下宏:
#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()" )
希望这对其他人有帮助!