2009-11-14 36 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