文件描述符上的 IO
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
执行它时的情况。在那种情况下,您不会期望能够通过 cin
读取数据两次。这是一样的。
我只是运行以下行为,想知道其背后的原因:
假设一个像这样的简化程序
...
{
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
执行它时的情况。在那种情况下,您不会期望能够通过 cin
读取数据两次。这是一样的。