【问题标题】:issues with select() statementsselect() 语句的问题
【发布时间】:2012-08-13 09:13:25
【问题描述】:

我有一个程序正在使用 select() 来轮询准备连接的套接字。

我有另一个绑定到套接字并发出 send() 命令的程序。

我的问题是文件描述符是否可以跨两个这样的可执行文件工作。

即如果我将程序 A 中的文件描述符 5 添加到 FD_SET,并且程序 B 中的套接字 fd 为 5,这是否意味着该套接字上的 send() 将唤醒正在对包含 5 的 FD_SET 执行选择的程序 A?

谢谢

【问题讨论】:

    标签: c sockets unix-socket


    【解决方案1】:

    不,文件描述符编号是特定于进程的。在不同的进程中使用相同的 fd 编号没有隐含的影响。

    【讨论】:

      【解决方案2】:

      它与文件描述符编号无关。

      如果您通过一个套接字通过一个连接发送,而该连接的另一端是一个正在被选择进行读取的套接字,则选择器将检测到读取事件。

      【讨论】:

      • 啊-好的。我的印象是 select 语句所关注的描述符集在所有进程中都是静态的。我会仔细检查我正在创建的套接字在两边是否相同。
      • @Derek 这种印象甚至没有意义。 FD 对进程来说是本地的。
      【解决方案3】:

      给定进程 (0-1023) 支持大多数 1024 个描述符(文件/套接字)(请参阅 /proc//limits 中进程支持的文件/套接字描述符的最大限制)。

      前 3 个描述符(0、1 和 2)分别分配给 stdin、stdout 和 stderr。下一个 值为 3 的描述符将分配给下一个打开的文件/套接字描述符,并且可以达到 /proc 中指定的限制。注意:您也可以更改最大支持的描述符。

      您可以在 /proc//fd 中查看给定进程打开的文件描述符列表。 每个进程描述符/信号/事件范围仅特定于进程。

      【讨论】:

      • 谢谢 - 我的下一个问题是看看如何找出进程打开了哪个 fd,因为我似乎遇到了一个问题,即 processA 无限期地监听一个准备好的套接字永远做不到
      • 为了方便调试,除了手动遍历/proc/fd,还可以试试lsof
      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2012-08-05
      • 2016-04-26
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多