背景:這是關於在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