C 是否可以从重定向中检索文件名?

C 是否可以从重定向中检索文件名?,c,file,stdin,C,File,Stdin,我正在做一些基本的文件操作,并且希望存储传递给可执行C程序的文件名,并创建一个扩展名附加在原始文件名上的新文件。例如,如果这是我在命令行中键入的内容: a.out < some_file.txt a.outpipe:[599869] 同样,它是高度特定于Linux的,不能移植到其他Posix系统。感谢您的快速回复。我没有想到其他情况下,它可能不是一个文件,这是有道理的,虽然现在它不容易成为可能。Oj!那太乱了,我想我应该想出另一种方法来命名这个文件。感谢您如此详细的回复!调用shell

我正在做一些基本的文件操作,并且希望存储传递给可执行C程序的文件名,并创建一个扩展名附加在原始文件名上的新文件。例如,如果这是我在命令行中键入的内容:

a.out < some_file.txt
a.out
如果
a.out
是一个可执行文件,有没有办法获取字符串
some_file.txt
,这样我就可以打开一个新文件,并将其称为
some_file.text.mod
或其他什么

argv[0]
获取
a.out
,在脚本中,您可以使用
$1
访问参数(但不是重定向中使用的文件名),但这两个参数在这里都没有多大用处


有什么想法吗?

在某些平台上,可以使用特定于平台的结构

e、 g.在linux上,可以在/proc/self/fd/0上调用readlink()

其他形式的重定向将不提供对文件名的访问,可能没有文件-数据可能通过管道提供

对于您的情况,在输入通过stdin重定向的情况下,您最好让用户决定输出文件名。
/proc/self/fd/0
可能是指向该文件的符号链接。(但是符号链接可能很糟糕,例如对于管道,这是Linux特有的)

因此,您可以从
a.out
内部调用
readlink(2)
系统调用
/proc/self/fd/0

但这样做有点恶心。但它的工作原理是:

% ls -l /proc/self/fd/0 < ~/.zshrc
lr-x------ 1 basile basile 64 Nov  6 19:22 /proc/self/fd/0 -> /home/basile/.zshrc

% date | ls -l /proc/self/fd/0
lr-x------ 1 basile basile 64 Nov  6 19:23 /proc/self/fd/0 -> pipe:[599869]
%ls-l/proc/self/fd/0<~/.zshrc
lr-x------1 basile basile 64 11月6日19:22/proc/self/fd/0->/home/basile/.zshrc
%日期| ls-l/proc/self/fd/0
lr-x------1 basile basile 64 11月6日19:23/proc/self/fd/0->pipe:[599869]

同样,它是高度特定于Linux的,不能移植到其他Posix系统。

感谢您的快速回复。我没有想到其他情况下,它可能不是一个文件,这是有道理的,虽然现在它不容易成为可能。Oj!那太乱了,我想我应该想出另一种方法来命名这个文件。感谢您如此详细的回复!调用shell脚本时,输入被重定向到文件,并且没有其他参数将在
$1
中为您提供任何信息。很好,现在编辑。