在没有数据的管道上打开ifstream而不阻塞
Open an ifstream on a pipe with no data without blocking
我正在尝试使用ifstream打开一个命名管道,最终将数据写入其中。
std::cout << "Opening " << name << std::endl;
std::ifstream manual_shutdown_file(name.c_str());
std::cout << "Opened " << name << std::endl;
当我运行程序时,它在ifstream
构造函数中阻塞。我看到"Opening name"打印到控制台上,但是没有显示已打开的语句。
我知道我正在连接管道,因为如果我执行
$ echo foo > name
,然后构造函数返回并打印已打开的语句。有没有办法打开管道,直到它有数据在它,即使我不想立即尝试读取它?
在管道的读端调用open
会阻塞,直到写端打开。
您可以使用O_NONBLOCK
标志来打开管道的文件描述符,但是没有标准的方法来使用fd和std::ifstream
,见这里。
猜测您的需求,我会说一个打开fd并呈现轮询信号接口的小类将适合,如:
namespace blah
{
class signal_t
{
private:
int fd;
// note: define sensible copy/move semantics
signal_t(const signal_t&) = delete;
signal_t& operator=(const signal_t&) = delete;
public:
signal_t(const char* named_pipe); // open fd, set O_NONBLOCK
void notify() const; // write 1 byte to fd as signal
bool poll() const; // attempt to read from fd, return true if signalled.
~signal_t(); // close fd
};
}
由于通过ifstream
块打开输入管道,直到有人向它写入,您总是可以让ifstream
块。然后从另一个线程解除阻塞,创建自己的ofstream
到同一管道,然后立即关闭ofstream
。这将解锁ifstream
并将其标记为eof
。这比使用特定于平台的文件句柄控件要容易得多,也更不容易出错。
实际上您可以在命名管道上打开std::ifstream
而不阻塞写入器,但是您必须设置标志,好像您也要写入流。
尝试std::ifstream pipe_stream(filename, std::ifstream::in | std::ifstream::out)
或stream.open(filename, std::ifstream::in | std::ifstream::out)
相关文章:
- 使用ifstream时,被调用文件中的数据不会打印
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 尝试使用 ifstream 读取数据后显示不正确的数字
- std::ifstream 数据类型?
- C++ ifstream 错误:无法读取数据
- 需要根据读取的数据类型将ifstream提取到单独的数组中
- 使用ifstream从DAT文件加载数据
- ifstream不使用C 中的数组检索数据
- 动态分配的数组在输出时丢失 ifstream 数据
- 使用 ifstream 将二进制数据读入结构
- 如何使用ifstream正确读取输入文件中的数据
- 使用ifstream使用getline缺少数据行
- Ifstream 读取无用的数据
- 为什么ifstream在读取混合数据时失败
- 尝试将数据保存到数组中时出现ifstream运行时错误
- 在使用 ofstream 将数据写入其文件后更新 ifstream 对象
- 使用 ifstream 从文件中读取数据并将其存储在数组中
- c++ ifstream 跳过数据
- 如何从 ifstream 检索数据
- ifstream Read 和 Fread 不返回相同的数据,C++