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

Linux中的C程序,用于读取作为终端参数传递的文件描述符,c,linux,file-descriptor,unistd.h,C,Linux,File Descriptor,Unistd.h,我一直在讨论如何从c程序中获取Linux上当前进程的开放文件描述符,但没有找到以下示例: ./sample 4</some_file 5<some_other_file /sample 4给定的样本由 ./sample 4</some_file 5<some_other_file 如果不想假定文件描述符是固定值,请不要在启动进程时将文件分配给硬编码描述符值 编辑: 我想让程序找出哪些FD在执行时是打开的 总的来说,我认为你做不到 但是,如果识别预打开的文件描述符的代码

我一直在讨论如何从c程序中获取Linux上当前进程的开放文件描述符,但没有找到以下示例:

./sample 4</some_file 5<some_other_file

/sample 4给定的
样本

./sample 4</some_file 5<some_other_file
如果不想假定文件描述符是固定值,请不要在启动进程时将文件分配给硬编码描述符值

编辑:

我想让程序找出哪些FD在执行时是打开的

总的来说,我认为你做不到

但是,如果识别预打开的文件描述符的代码在调用
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
    }
}
for(intfd=3;fd

是的,这对于多线程程序来说是天生的快速性。如果您使用的是GCC,那么可以将代码放入一个具有
\uuuu属性((构造函数))
的函数中,它将在调用
main()
之前运行。但即使这样,也可以将其他函数打开的文件识别为父进程传递的文件。

您可以在代码中使用文件描述符4和5。你是在问程序如何知道你重定向了哪些?我已经编辑了这个问题:)对不起。可能是这样的?@Kevin我一直在看这个例子,但它似乎并不优雅。。。当然,如果可能的话,我认为最清晰的方法是以这种方式获取fds作为参数。然后您当然也可以将fds作为参数传递:
/sample 4我不是说fds 4和5是“静态的”。我想知道在执行死刑后哪些FD是开放的。对不起,有个不清楚的问题。
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
    }
}