在管道上打开ifstream,没有数据而没有阻塞

Tro*_*els 5 c++ fstream named-pipes ifstream

我试图使用ifstream打开一个命名管道,最终将数据写入它.

std::cout << "Opening " << name << std::endl;
std::ifstream manual_shutdown_file(name.c_str());
std::cout << "Opened " << name << std::endl;
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,它在ifstream构造函数中阻塞.我看到打开控制台的"打开名称",但是没有出现打开的语句.

我知道我正在连接管道,因为如果我执行

$ echo foo > name
Run Code Online (Sandbox Code Playgroud)

从shell中,然后构造函数返回并打印Opened语句.即使我不想立即尝试读取数据,也没有办法打开管道,直到它有数据为止?

myt*_*gel 2

调用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
};
}
Run Code Online (Sandbox Code Playgroud)