2009-11-14 37 views

回答

11

无法正确输入文件名; shell会处理所有重定向的东西,而不会告诉你。

在直接< file重定向的情况下,可以通过使用fstat得到一个inode编号它,然后走在文件层次类似于find/-inum获得与其匹配的路径检索与标准输入相关的文件路径。 (由于链接,可能会有多个这样的文件路径。)

但是,您不应该需要这样做。正如其他人所说,如果你需要知道文件名,你应该把文件名作为参数。

+3

的“检索文件路径”的操作很可能是恶魔般的昂贵 - 加倍所以如果你有NFS文件系统上的大量扫描。此外,如上所述,它可能不会给你一个答案;例如,管道连接在文件系统中根本没有名称。 – 2009-11-14 14:02:29

+0

是的,确实如此。这是一个全面的损失。 – bobince 2009-11-14 14:10:31

4

为什么你想这样做?所有程序a.out从shell传递,是一个打开的文件描述符stdin。

用户不妨这样做:

cat inpfilename | ./a.out 

,现在你绝对没有使用文件名中(除的/ dev /标准输入)。

如果a.out需要使用文件名,为什么不把该文件作为命令行参数?

2

只有父shell才会知道。该程序,a.out总是会将其视为标准输入。

1

您的操作系统将为您的程序提供来自此文件的输入。这对您的程序是透明的,因此您不会看到文件的名称。事实上,在某些情况下,你会反馈输入,来自文件,比如这个:

ls | ./a.out 

什么你以后是非常系统特定的。可能更好的解决方案是将文件名作为参数传递。这样你得到文件名,你可以打开它来阅读内容。

0

正如您所说的那样,运行a.out的进程没有提供其标准输入的文件名的概念。

调用应该是:

$ ./a.out inputfilename 

int main(int argc, char* argv[]) { ... }

$ ./a.out <<< "inputfilename" 

解析argv,并从标准输入文件名。

然后在a.c中您需要fopen该文件才能读取它的内容。

0

我不认为这是可能的,因为<刚刚读到STDIN的inpfilename的内容。

如果您希望inpfilename可用于您的程序,但您也希望能够接受来自STDIN的数据,请将程序设置为接受文件名参数并将其打开至FILE。如果没有参数给STDIN分配给你的文件。然后你的输入阅读程序使用fscanf这样的函数而不是scanf,并且你传入的文件是链接到fopened文件或STDIN的文件。

0

一种fstat(0,sb)(0是标准输入文件描述符)会给你对输入文件的细节,大小,权限(称为模式)和器件的i节点驻留上。

反正你将不能够告诉它的路径:与unix的inode不知道他们属于哪个路径,并在技术上(见ln),他们可能属于多个路径

0

天儿真好,

如上回答所有你看到的是打开的文件描述符标准输入指出。

如果您确实想要这样做,您可以指定输入文件的第一行必须是文件本身的名称。

HTH