【问题标题】:Who stole my file descriptors?谁偷了我的文件描述符?
【发布时间】:2015-05-16 18:03:51
【问题描述】:

我正在学习 socketpair() 函数。该函数返回的文件描述符是 5 和 6。如何检查分配给哪些文件/套接字描述符 3 和 4?

【问题讨论】:

  • 你为什么在乎?你为什么要检查文件描述符的值是什么?
  • strace 会告诉你一些事情。
  • @iharob:因为,我在学习,伙计
  • 也许您之前调用过一次socketpair() 并且错过了关闭返回的套接字描述符?
  • @alk:我之前测试过这样一个程序的行为,它在退出时关闭文件描述符,真的不需要 close()。

标签: c file-descriptor


【解决方案1】:

Linux 具体答案如下:

一种可能的方法是在sockerpair() 调用之后添加一个pause(3) 调用。这将暂停程序,让您有机会查看“/proc/[程序的pid]/fd”。这应该会给你一些关于其他打开的文件描述符是什么的信息。

【讨论】:

  • 我的 Linux 发行版 (kali) 上没有 /proc/fd,有很多 /proc/some_number/fd,但我不知道我要查找的目录是什么
  • @oleg.s: some_number 将是相关程序的进程 ID。
  • @oleg.s,正如@alk 所说,它是/proc/<pid of your program>/fd,而不是/proc/fd。该目录由将 fd 编号链接到打开的实际文件的符号链接组成。例如:lrwx------ 1 root root 64 May 17 08:34 0 -> /dev/pts/0。这意味着 fd 0 在文件 /dev/pts/0 上打开
【解决方案2】:

为了改进Frederik Deweerdt' answer(假设是Linux 系统),出于调试目的,您可以在成功 调用socketpair(2) 之后添加以下内容(对于Linux 系统)(所以在检查之后它没有失败):

 char cmdbuf[64];
 snprintf (cmdbuf, sizeof(cmdbuf), 
           "/bin/ls -l /proc/%d/fd/", (int) getpid());
 system(cmdbuf);

但这只是一个令人作呕的调试技巧。如果您真的想从正在运行的程序中获得这样的信息(当然opendir 将使用文件描述符阅读目录...)。详情请见proc(5)

或者,如果您的程序在 pid 1234 的进程中运行,只需在其他终端输入 ls -l /proc/1234/fd/

你也可以strace(1)你的整个程序。

顺便说一句,你为什么关心使用了哪些文件描述符?

当然,如果您愿意,您可以readlink(2) /proc/self/fd/4 从您的程序内部了解文件描述符 4 是如何在其中使用的。请注意,readlink 采用文件路径,而不是打开的文件描述符。

【讨论】:

  • 这个 lib/tools procps.sourceforge.net 用于帮助我设置一些调试代码以提取 /proc 相关信息。
  • @el.pescado:当然可以,但是足够了,至少“通常” ;-)
  • 但是,您仍然必须记住,那些不是您要查找的文件描述符 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多