谁偷了我的文件描述符?

Who stole my file descriptors?

我正在学习 socketpair() 函数。该函数返回的文件描述符是 5 和 6。我如何检查 files/sockets 描述符 3 和 4 分配给了什么?

Linux具体答案如下:

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

改进Frederik Deweerdt' answer (and assuming a Linux system), for debugging purposes you might add the following (for Linux systems) after a successful call to socketpair(2)(所以在检查后它没有失败):

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

但这只是一个令人作呕的调试技巧。您可能 opendir(3) then readdir(3) the /proc/self/fd/ directory (and don't forget to closedir it), if you really want such an information from your running program (of course opendir will consume a file descriptor to read the directory...). See proc(5) 了解详情。

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

您还可以 strace(1) 您的整个程序。

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

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