2

単一のログのようなファイルが複数のプロセスによって書き込まれるこのツールがあります。

私が達成したいのは、ファイルを最初に開いたときにファイルを切り捨て、最後にファイルを開いたいくつかのプロセスによってすべての書き込みを行うことです。出力が混乱しないように、すべての書き込みは体系的にフラッシュされてミューテックスで保護されます。

最初に、プロセスはファイルを作成し、次に一連の他のプロセスを一度に 1 つずつ開始し、ファイルを開いて書き込みます (マスターは追加のコンテンツでチャイムを鳴らすことがあります。スレーブ プロセスは開いている場合と開いていない場合があります。何かを書いている)。

可能な限り、既存のものよりも多くの IPC を使用しないようにしたいと思います (現在行っているのは、popen で作成されたパイプに書き込むことだけです)。CRT と Win32 API 以外の外部ライブラリにはアクセスできず、シリアライゼーション コードの記述を開始したくありません。

ここに私が行った場所を示すいくつかのコードがあります:

// open the file. Truncate it if we're the 'master', append to it if we're a 'slave'
std::ofstream blah(filename, ios::out | (isClient ? ios:app : 0));

// do stuff...

// write stuff
myMutex.acquire();
blah << "stuff to write" << std::flush;
myMutex.release();

まあ、これはうまくいきません: スレーブ プロセスの出力は期待どおりに並べられますが、マスターが書き込む内容は、存在する場合でも、一緒にまとめられているか、間違った場所に置かれています。

2 つの質問があります: ofstream のコンストラクターに与えられたフラグの組み合わせは正しいものですか? とにかく私は正しい道を進んでいますか?

4

6 に答える 6

1

reinier が示唆したように、問題はファイルの使用方法ではなく、プログラムの動作にありました。

fstreamは問題なく機能します。

私が見逃したのは、マスターとスレーブ間の同期です (前者は、特定の操作が同期していない場合に同期していると想定していました)。

編集:まあ、まだオープン フラグに問題がありました。ios::out でファイルを開いたプロセスは、必要に応じてファイル ポインターを移動しませんでした (他のプロセスが書き込んでいたテキストを消去します)。また、コードの別の部分が cerr を使用するため、cout に書き込むときに seekp() を使用すると出力が完全にねじ込まれます。

私の最終的な解決策は、ミューテックスとフラッシュを保持し、マスター プロセスの場合、ファイルを ios::out モードで開き (ファイルを作成または切り捨てるため)、ファイルを閉じて、ios::app を使用して再度開くことです。

于 2009-12-16T19:02:04.563 に答える
1

独自のプロセスを持ち、書き込みプロセスを処理する 'lil log システムを作成しました。アイデアは非常に単純です。ログを使用するプロセスは、ログ プロセスがファイルに書き込もうとする保留キューにログを送信するだけです。これは、リアルタイム レンダリング アプリでのバッチ処理に似ています。このようにして、あまりにも多くのファイルを開く/閉じる操作を取り除くことができます。できればサンプルコードを追加します。

于 2009-12-23T13:24:19.733 に答える
0

そのミューテックスをどのように作成しますか?
これが機能するには、両方のプロセスが実際に同じものをロックするように、これを名前付きミューテックスにする必要があります。
ミューテックスが実際に正しく機能していることを確認するには、あるプロセスとそれを取得しようとする別のプロセスでミューテックスをロックする小さなコードを使用します。

于 2009-12-16T16:16:26.227 に答える
0

1 つのオプションは、ACE ::logging を使用することです。同時ロギングの効率的な実装があります。

于 2009-12-29T05:23:29.227 に答える
0

ミューテックスを解放する前に、テキストがファイルに完全に書き込まれるようにブロックすることをお勧めします。あるタスクからのテキストが、より優先度の高いスレッドからのテキストによって中断されるインスタンスがありました。とてもきれいに見えません。

また、形式をカンマ区切り形式にするか、スプレッドシートに簡単にロードできる形式にします。スレッド ID とタイムスタンプを含めます。テキスト行のインターレースは、スレッドがどのように相互作用しているかを示しています。ID パラメータを使用すると、スレッド別に並べ替えることができます。タイムスタンプを使用して、連続アクセスと期間を表示できます。スプレッドシートに適した形式で記述すると、変換ユーティリティを作成しなくても、外部ツールを使用してログ ファイルを分析できます。これは私を大いに助けました。

于 2009-12-16T19:03:15.343 に答える