[英]IO on file descriptors
我只是遇到以下行為,並想知道其背后的原因:
假設像這樣的簡化程序
...
{
std::ifstream in(argv[1]);
assert(in.good());
while (std::getline(in, line)) {
// Area 1
}
in.close();
}
{
std::ifstream in(argv[1]);
assert(in.good());
while (std::getline(in, line)) {
// Area 2
}
in.close();
}
如果這樣的程序被調用為:
./myProg xxx
既 ,區域1和區域2將被輸入n次,其中n是在XXX行數。
但是,如果這樣調用我(使用bash):
./myProg <(head -n 100 xxx)
區域1將被輸入100次, 區域2將被輸入0次。 兩個斷言(in.good())都可以通過。 顯然,第二個參數傳遞了文件描述符(如果我打印自變量,則類似於/ dev / fd / 63),而不是實際文件,並且該東西可以打開以讀取一次-但是當打開兩次時,對於第二次通話。
我不知道背后的原因是什么。
head
進程由bash
執行一次,並將其輸出重定向到管道,您的進程可以通過該管道通過文件inode訪問該管道。 您的程序對該head
命令一無所知,嘗試關閉並重新打開該文件不會導致該文件再次執行。
這類似於您的程序從cin
讀取並以head -n 100 xxx | ./myProg
執行的情況head -n 100 xxx | ./myProg
head -n 100 xxx | ./myProg
。 在這種情況下,您將無法通過cin
兩次讀取數據。 都一樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.