2013-03-16 64 views
0

我正在阅读W. Richard Stevens的Unix Network Programming。 作者说,如果阻塞连接呼叫中断,我可以使用'选择'作为非阻塞连接的选择。阻止'connect'系统调用中断

我很困惑。如果我应该调用一个非阻塞连接,然后选择新的socktfd,或者应该选择传递给前一个阻塞连接调用的旧socketfd?

而且我在帖子中看到,如果信号动作与SA_RESTART标志一起传递,则说'连接'是可重新启动的。如果这样我完全可以忽略阻塞连接中断的情况?

+0

在提示符处输入'man 7 signal'。搜索EINTR。它解释了一切。如果您的流程中没有任何可能触发信号的代码,那么您可能不必担心这一点。或者你可以把EINTR看作是一个瞬态错误(类似于EAGAIN,EWOULDBLOCK),并且可以正常恢复。 – selbie 2013-03-16 05:28:10

+0

什么是新sockfd?每个插座只有一个。调用connect()不会创建新的Le。 – EJP 2013-03-16 06:46:24

回答

0

如果您正在使用阻塞呼叫,您将必须检查错误代码并根据错误代码重试,如果发生中断,该错误代码将为EINTR。否则使用选择哪个不会因为中断而返回。在超时,错误或读写信号的情况下,仅选择返回。

+0

你是不是指EINTR? – selbie 2013-03-16 05:28:56

+0

对不起我的错误。修复。 – 2013-03-16 06:04:37

+0

我试图弄清楚的是这个。如果应用程序不在其自己的代码中调用信号,EINTR是否可以实际发生?或者是否有一些常见的库会产生这些会干扰套接字代码的信号中断? – selbie 2013-03-16 06:07:48