2012-01-02 19 views
1

tsharkユーティリティ(system()コマンドを使用)を使用して1つのスレッドを使用してパケットのフィールドを取得すると、出力がファイルにリダイレクトされます。この同じファイルは別のスレッドによって同時に読み取られる必要があるため、ファイル内で観測されるフィールドに基づいて実行時の決定を行うことができます。2つのスレッドによるファイルの同時読み込み/書き込み

最初のスレッドがファイルに書き込み中であっても、2番目のスレッドはそれを読み取れません(ファイルからNULLを読み込みます)。なぜ私はこのように行動しているのか分かりません。私はそれが同じファイルへの同時アクセスのためかもしれないと思った。私はmutexロックを使うことを考えましたが、それは読み込みスレッドをブロックするでしょう。なぜなら最初のスレッドはプログラムが終了したときに終了するだけなので、

どうすればいいですか?

+0

libpcapまたはwinpcapを使用して直接プログラムに入れたいパケットをキャプチャするのではなく、なぜこのようにしていますか? –

+0

私はいくつかのフィールドしか必要とせず、tsharkがそれらのフィールドを正確に与えることができるからです... – user1126425

答えて

2

プロセス間通信にこのファイルを使用している場合は、代わりに名前付きパイプまたはメッセージキューを使用できます。 1つのスレッドが書き込みを行い、もう1つのスレッドがデータが利用可能なときに読み込むため、同期は不要です。

編集:スレッド間の通信のためにあなたは、単にいくつかのデータは、(生産者 - 消費者パターン)が生成されたときに知らせるために、共有変数および条件変数を使用することができます。以下のような何か:

// thread 1 
while(1) 
{ 
    // read packet 
    // write packet to global variable 
    // signal thread 2 
    // wait for confirmation of reading 
} 

// thread 2 
while(1) 
{ 
    // wait for signal from thread 1 
    // read from global variable 
    // signal thread 2 to continue 
} 

信号部分は、条件変数を用いて実装することができます:pthread_cond_t

+0

いいえ、私はスレッド間通信のためにそのファイルを使用しています..パイプ/キューを使用できますか?これらの詳細については、ソースを提供できますか? – user1126425

+0

@ user1126425:編集しました。それが役に立てば幸い。 – Tudor

+0

ヒントのためにチューダーに感謝します。私は問題がスレッドではなく、tsharkユーティリティからの出力をファイルにリダイレクトしていることを知りました。リダイレクション演算子は、プロセスを終了すると(ctrl + cを使用して)ファイルにtsharkの出力を書き込むだけです...他のスレッドがデータを見ることができない理由は何ですか...どのような考えですか? – user1126425

関連する問題