背景:这是关于在C++(Linux/GCC)中处理系统调用的EINTR的this thread的后续问题。无论我是否打算介绍我的应用程序,似乎我应该将系统调用设置为errno
至EINTR
作为特例。有many,many,many关于使用goto
的意见。处理EINTR(带goto?)
我的问题:是一个系统调用设置errno
到EINTR
其中goto
被认为是正常的情况下?如果没有,那么你会如何建议转换下面的代码来处理EINTR
?
if ((sock_fd = ::socket(domain, type, protocol)) < 0) {
throw SocketException("Socket::Socket() -> ::socket()", errno);
}
在此先感谢!
干杯,
克里斯
UPDATE:基于下面的答案,我结束了写下面的宏:
#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()")
希望这可以帮助别人!
克里斯,得到这本书:http://www.unpbook.com - 你会很高兴你做到了。源代码在线http://www.unpbook.com/src.html - 请参阅此处了解如何处理EINTR的示例。 – 2010-06-02 13:34:33
我从来没有想过使用时/继续 - 伟大的想法! – 2010-06-02 14:17:01