文件描述符上的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多次。两个断言(在.good()中)都通过了。第二个断言似乎传递了一个文件描述符(如果我打印参数,则类似于/dev/fd/63),而不是一个实际的文件,并且这个东西可以打开读取一次,但当打开两次时,第二个调用似乎为空。
我想知道这背后的原因是什么。
head
进程由bash
执行一次,并将其输出重定向到进程可以通过该文件索引节点访问的管道。您的程序对head
命令一无所知,尝试关闭并重新打开该文件不会导致它再次执行。
这与您的程序从cin
读取并作为head -n 100 xxx | ./myProg
执行时的情况类似。在这种情况下,您不会期望能够通过cin
读取两次数据。这是一样的。
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- 使用VerQueryValue检索应用程序的文件描述
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- Agora.io 虚幻引擎插件构建错误
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 如何在 CompleteAsyncIO 中访问 IOMemoryBufferDescriptor,该描述符通过中断 EP
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 文件描述符上的IO
- 我可以访问 std::[io]fstream 下面的文件描述符吗?