我有一个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在有限的时间内阻止,或者根本不阻止?如果它失败了,它很容易正常清理,但实际上需要它首先失败..
答案 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
)基本上委托操作系统,并认为操作系统会
做正确的事。它支持的界面非常非常
有限; open
(O_SYNC
,O_NONBLOCK
等许多重要选项
未映射,因此无法使用。我发现的唯一解决方案
这是要么使用std::ostringstream
,然后将字符串写入
文件使用系统级调用,或写我自己的streambuf
,其中
做我想要的(比听起来简单得多,因为你通常只有
需要filebuf
提供的部分内容 - 您通常不需要
双向性,寻求或代码翻译)。
当然,这些解决方案都不是便携式的。
最后,我不确定你为什么要写/tmp
。按照惯例,
您放入/tmp
的任何内容都应包含进程ID。并为
出于安全考虑,我总是创建一个带有进程id的子目录
以其名义,并具有非常有限的访问权限,并创建任何
其中的临时文件。