2

/ tmp(* nixシステム上)でファイルを開き、その内容を読み取るC++プログラムがあります。

これを行うために、私は使用しています:

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

ここで、abs_pathは、ファイルへの絶対パスを含む文字列です。

問題は、一部の*nixプログラムが/tmp内のファイルとして名前付きパイプを作成することです。例えば、

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

私が使用しているデバッグユーティリティによって作成されたパイプです。

ofstreamのドキュメント では、openメソッドは、ファイルを開くことが失敗したときにメソッドがエラービットを設定すると述べています。ただし、私のテストでは、代わりにファイル(実際にはパイプ)を無期限に開こうとしてハングします。これは、ファイルが別のプログラム(おそらくデバッガー)によってロックされているためだと思います。

では、どうすればofstream :: openを強制して有限時間ブロックすることができますか、それともまったくできませんか?失敗した場合に正常にクリーンアップするのは簡単ですが、実際には最初に失敗する必要があります。

4

2 に答える 2

4

簡単な答えは、できないということです。 filebuf::open(によって呼び出され ofstreamます)は基本的にOSに委任し、OSが正しいことを行うと想定しています。また、サポートするインターフェースは非常に限られています。open( O_SYNC、など)に対する多くの重要なオプションO_NONBLOCKがマップされていないため、使用できません。これに対して私が見つけた唯一の解決策は、 を使用してstd::ostringstreamから、システム レベルの呼び出しを使用して文字列をファイルに書き込むか、自分の を作成するstreambufことです。多くの場合、双方向性、シークfilebuf、またはコード変換は必要ありません)。

もちろん、これらのソリューションはどちらも移植可能ではありません。

最後に、なぜあなたが に書いているのかわかりません/tmp。慣例により、入力するものにはすべて/tmpプロセス ID を含める必要があります。また、セキュリティ上の理由から、名前にプロセス ID が含まれ、アクセス権が非常に制限されたサブディレクトリを常に作成し、その中に一時ファイルを作成していました。

于 2012-09-28T09:01:12.533 に答える
3

私の知る限り、C++ 言語で定義されたノンブロッキング入力などはありません。(メソッド std::streambuf::in_avail() がありますが、それでも役に立ちません)

Cメソッドの使用を検討できます

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

std::ofstream の代わりに

于 2012-09-28T08:53:27.927 に答える