谁偷了我的文件描述符?
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
采用文件路径,而不是打开的文件描述符。
我正在学习 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
采用文件路径,而不是打开的文件描述符。