我一直在研究如何从 c 程序获取 Linux 上当前进程的打开文件描述符的不同讨论,但找不到以下示例:
./sample 4</some_file 5<some_other_file
在这种情况下,有什么方法可以在 sample.c
程序中获取这些文件描述符。我发现这些重定向不被视为命令行参数。希望有人能帮忙。
当然,fds 4 和 5 只是作为示例给出的,我希望程序在执行时找出哪些 fds 是打开的。
最佳答案
给定的示例
开始于
./sample 4</some_file 5<some_other_file
这将提供可用于访问这些文件的文件描述符:
int fd_for_some_file = 4;
int fd_for_some_other_file = 5;
如果您不想假设文件描述符是固定值,请不要在启动进程时将文件分配给硬编码的描述符值。
编辑:
I would like the program to find out which fds were open on execution.
一般来说,我认为你做不到。
但是,如果您识别预打开文件描述符的代码在任何 open
调用之前运行,您可以只运行大于 2 的值以查看它们使用的是什么 OS-具体手段。在 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()
之前运行。但即便如此,也可以将由其他此类函数打开的文件识别为由父进程传递。
关于Linux 中的 C 程序读取作为终端参数传递的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372103/