我一直在研究如何从c程序获取Linux上当前进程的打开文件描述符,但找不到以下示例:
./sample 4</some_file 5<some_other_file
在这种情况下,有没有办法在sample.c
程序中获取这些文件描述符。我发现这些重定向不被视为命令行参数。希望有人可以提供帮助。
当然fds 4和5仅作为示例给出,我希望程序找出哪些fds在执行时打开。
答案 0 :(得分:2)
鉴于sample
由
./sample 4</some_file 5<some_other_file
这将提供可用于访问这些文件的文件描述符:
int fd_for_some_file = 4;
int fd_for_some_other_file = 5;
如果您不想假设文件描述符是固定值,请不要在启动进程时将文件分配给硬编码的描述符值。
编辑:
我希望程序找出哪些fds在执行时打开。
总的来说,我认为你不能。
但是,如果用于识别预先打开的文件描述符的代码在open
的任何调用之前运行,则可能只需运行大于2的值即可查看它们使用特定于操作系统的方法。在Linux上:
for ( int fd = 3; fd < fd_max; fd++ )
{
sprintf( linkname, "/proc/self/fd/%d", fd );
int rc = readlink( linkname, linkvalue, sizeof( linkvalue ) );
if ( rc == 0 )
{
// found a file opened by calling process
}
}
是的,对于多线程程序来说,这本身就很有趣。如果您正在使用GCC,则可以将代码放在__attribute__(( constructor ))
的函数中,并在调用main()
之前运行。但即便如此,也可以识别由父进程传递的其他此类函数打开的文件。