问题:我正在运行一个服务器程序,它使用 TCP 套接字连接到远程程序。其中有很多(比如说 20 个)。我的问题是套接字描述符之一已损坏并且已收到 EOF。但由于程序中的错误,它永远不会关闭它,而是将其添加回 select() 集合并导致不必要的痛苦。
我做了什么才找到它:我附加到 DDB,并对它们中的每个调用 read(fd,..) 。坏描述符返回 0,我在那里点击了它。
虽然这对我有用,但会浪费来自其他套接字的字节,并且其他函数可能会出现错误。
我在寻找什么是想了解一种非侵入式机制,可以在不影响正在运行的程序的情况下解决我的目的。
顺便说一句,我的 NetBSD 系统只理解 tcsh。
答案1
在 BSD 派生系统中,调查另一个正在运行的进程中打开的文件描述符的规范方法是使用fstat
(1) 命令(使用-p
指定感兴趣的进程 ID 的选项)。
从fstat
输出中可以判断对等方是否已关闭 TCP 连接。
但是,如果问题实际上是您拥有源代码的程序中的错误,那么您可能应该-g
使用适当的用户级调试器(例如本机提供的gdb
.