簡體   English   中英

在C中如何打印在shell中重定向為輸入的文件的文件名

[英]In C how do I print filename of file that is redirected as input in shell

$cc a.c
$./a.out < inpfilename

我想在stdout上打印inpfilename。 我怎么做 ? 我在這里先向您的幫助表示感謝...

您無法完全按輸入獲取文件名; shell會在不告訴你的情況下處理所有重定向的東西。

在直接< file重定向的情況下,您可以使用fstat檢索與stdin關聯的文件路徑,以獲取它的inode編號,然后以類似於find / -inum方式遍歷文件層次結構以獲取find / -inum匹配的路徑。 (由於鏈接,可能會有多個這樣的文件路徑。)

但你不應該這樣做。 正如其他人所說,如果你需要知道文件名,你應該把文件名作為參數。

你為什么要這樣做? 你的所有程序a.out都是從shell傳遞的,是一個打開的文件描述符,stdin。

用戶不妨這樣做:

cat inpfilename | ./a.out

現在你絕對沒有文件名可供使用(除了/ dev / stdin)。

如果a.out需要使用文件名,為什么不將該文件作為命令行參數?

只有父shell才會知道。 該程序,a.out總是將其視為標准輸入。

您的操作系統將為您的程序提供此文件的輸入。 這對您的程序是透明的,因此您無法查看文件的名稱。 實際上,在某些情況下,您將獲得不是來自文件的輸入,例如:

ls | ./a.out

你所追求的是特定於系統的。 可能更好的解決方案是將文件名作為參數傳遞。 這樣你就可以得到文件名,你可以打開它來閱讀內容。

實際上,可以從procfs獲取文件名,因為/ proc / * / fd包含打開文件的符號鏈接:

char filename[bufsize];
int sz = readlink("/proc/self/fd/0", filename, bufsize-1);
filename[sz] = 0;
puts(filename);

正如您所說,運行a.out的進程沒有提供其標准輸入的文件的文件名的概念。

調用應該是:

$ ./a.out inputfilename

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

要么

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

並從stdin獲取文件名。

然后在ac中你需要fopen該文件來讀取它的內容。

我不認為這是可能的,因為<只是將inpfilename的內容讀取到STDIN。

如果希望inpfilename可用於您的程序,但您也希望能夠接受來自STDIN的數據,請將程序設置為接受文件名參數並將其打開到FILE。 如果沒有給出參數,則將STDIN分配給您的文件。 然后,您的輸入讀取例程使用fscanf而不是scanf等函數,並且傳入的FILE是指向fopened文件或STDIN的鏈接。

fstat(0,sb) (0是stdin文件描述符)將為您提供有關其所在設備的輸入文件,大小,權限(調用模式 )和inode的詳細信息。

無論如何,你將無法告訴它的路徑:因為unix inode不知道它們屬於哪條路徑,從技術上講(見ln )它們可能屬於多條路徑

天兒真好,

正如上面的回答所指出的,你看到的是打開文件描述符stdin。

如果您確實想這樣做,可以指定輸入文件的第一行必須是文件本身的名稱。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM