gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:42 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com