对ofstream :: open的非阻塞调用?

时间:2012-09-28 08:37:37

标签: c++ io nonblocking ofstream

我有一个C ++程序,它在/ tmp(在* nix系统上)打开文件并读取它们的内容。

要做到这一点,我正在使用:

ofstream dest;
dest.open(abs_path.c_str(), ios::app);

其中abs_path是一个包含文件绝对路径的字符串。

问题是某些* nix程序将命名管道创建为/ tmp中的文件。例如,

 /tmp/vgdb-pipe-to-vgdb-from-23732-by-myusername-on-???

是由我正在使用的调试实用程序创建的管道。

在of documentation for ofstream中,open方法表示该方法在打开文件时设置错误位失败。但是,在我的测试中它反而挂起试图无限期地打开文件(实际上是一个管道)。我假设这是因为该文件被另一个程序(可能是调试器)锁定。

所以,我怎么能强制ofstream :: open在有限的时间内阻止,或者根本不阻止?如果它失败了,它很容易正常清理,但实际上需要它首先失败..

2 个答案:

答案 0 :(得分:3)

AFAIK,没有C ++语言定义的非阻塞输入。 (有一个方法std :: streambuf :: in_avail(),但它仍然无法帮助你)

您可以考虑使用C方法

int file_descr = open( "pipe_addr", O_RDONLY |O_NONBLOCK);

而不是std :: ofstream

答案 1 :(得分:3)

简单的答案是,你做不到。 filebuf::open(由 ofstream)基本上委托操作系统,并认为操作系统会 做正确的事。它支持的界面非常非常 有限; openO_SYNCO_NONBLOCK等许多重要选项 未映射,因此无法使用。我发现的唯一解决方案 这是要么使用std::ostringstream,然后将字符串写入 文件使用系统级调用,或写我自己的streambuf,其中 做我想要的(比听起来简单得多,因为你通常只有 需要filebuf提供的部分内容 - 您通常不需要 双向性,寻求或代码翻译)。

当然,这些解决方案都不是便携式的。

最后,我不确定你为什么要写/tmp。按照惯例, 您放入/tmp的任何内容都应包含进程ID。并为 出于安全考虑,我总是创建一个带有进程id的子目录 以其名义,并具有非常有限的访问权限,并创建任何 其中的临时文件。