谁偷了我的文件描述符?

时间:2015-05-16 18:03:51

标签: c file-descriptor

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

2 个答案:

答案 0 :(得分:3)

Linux特定答案如下:

可能的方法是在pause(3)电话后立即添加sockerpair()电话。这将暂停程序并让您有机会查看' / proc / [程序的pid] / fd'。这应该会为您提供有关其他打开文件描述符的信息。

答案 1 :(得分:1)

要改进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(3)然后readdir(3) /proc/self/fd/目录(并且不要忘记它closedir)(当然opendir将使用文件描述符来读取目录...)。有关详细信息,请参阅proc(5)

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

您也可以strace(1)整个计划。

BTW,你为什么要关心使用哪些文件描述符?

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