Linux 中的 C 程序读取作为终端参数传递的文件描述符

标签 c linux file-descriptor unistd.h

我一直在研究如何从 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/

相关文章:

c - 在 xcode 中运行 c 什么也没显示

c - 在c中使用getpwuid()检索文件的所有者名称总是抛出root

linux - 带有 svn post-commit Hook 的 trac-admin 导致段错误

c - exec 是否保留文件描述符

C 代码迭代器按 sizeof(int) 而不是按字节递增

c - 这个会漏吗?

c - 函数中的 malloc 不能正常工作

c - dup() 后跟来自多个线程或进程的 close()

c - 使用打开的文件描述符

c - void * 参数地址移位