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

时间:2018-03-19 20:45:46

标签: c linux file-descriptor unistd.h

我一直在研究如何从c程序获取Linux上当前进程的打开文件描述符,但找不到以下示例:

./sample 4</some_file 5<some_other_file

在这种情况下,有没有办法在sample.c程序中获取这些文件描述符。我发现这些重定向不被视为命令行参数。希望有人可以提供帮助。

当然fds 4和5仅作为示例给出,我希望程序找出哪些fds在执行时打开。

1 个答案:

答案 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()之前运行。但即便如此,也可以识别由父进程传递的其他此类函数打开的文件。