[英]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.