【问题标题】:Can socket() fail with EINPROGRESSsocket() 是否会因 EINPROGRESS 而失败
【发布时间】:2017-02-23 21:29:34
【问题描述】:

socket() 函数是否有可能在 Linux 中以 EINPROGRESS 失败?请注意,我专门询问的是socket(),而不是connect() 或其他人。

POSIX 没有将EINPROGRESS 列为可能的错误代码。但是 Linux 中 socket() 的手册页说:

底层协议模块可能会产生其他错误。

在任何情况下,此调用实际上可能会因EINPROGRESS 而失败?

【问题讨论】:

  • 我不知道怎么做。没有什么可以进行的。不涉及 I/O:只是创建一个套接字 FD。为什么要问?
  • 我认为手册页在这里是明确的:可能有协议,实际上 do 在调用socket() 时返回EINPROGRESS。但是没有一个常用的协议这样做。那时不可能返回引用的文件描述符,所以它必须是一个硬错误,这与EINPROGRESS的含义有些冲突

标签: c linux sockets


【解决方案1】:

EINPROGRESS 表示操作正在进行中。它会因为外部原因而阻塞:等待远程操作或本地设备。

socket() 只是在系统内存中创建一个条目:没有理由等待任何远程操作或任何设备。

但是,如果它能够返回 EINPROGRESS,您将无需等待。

使用文件句柄和套接字句柄,您可以使用 select() 来等待系统准备好。但是如果 socket() 本身没有返回任何东西,你就没有什么可等待的了。

我认为 socket() 没有理由返回 EIPROGRESS,但无论如何这都是个坏主意。

【讨论】:

    【解决方案2】:

    也许不是您想要的答案:

    您必须彻底检查相应的 Linux kernel source code (kernel/net/socket.c) 才能 100% 确定。浏览代码,看起来EINPROGRESS 在任何地方都没有返回。但是里面有依赖运行时的调用,所以仅从静态代码分析很难说。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2012-11-21
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多