2

LinuxQtライブラリを使用して、アプリケーションを作成しています。

だから、2つありQThreadsます。スレッドpcap_next()関数の 1 つで、whileサイクルで呼び出しています。多くの場合、すべてのスレッドは、作業中に互いのパブリック メンバーを使用します。

ライブラリを使用せずpcapに (たとえば、ハードディスクからパケットを読み取る) すべてが正しいのですが、pcap の関数を別の に配置しようとするとthread、SEGFAULT エラーが発生します。

仕組みが理解できませんpcap。プロセス全体がフリーズしているように見えますpcap。このため、スレッドは互いのパブリック メンバーにアクセスできません。

run()pcap のスレッドの主な機能は次のようになります。

while()
{
   Data = pcap_next(handle, &header);
   if (Data...)
   {
        //processing functions
   }
}

何か案は?

4

1 に答える 1

2

「プロセス全体をフリーズする」と、他のスレッドが実行されなくなります。プロセスがクラッシュすることはありません。

pcap_tプログラムが複数のスレッドで単一の同時呼び出しを行う場合、pcap_breakloop()(ブロックされているスレッドを中断しない - UN*X でシグナルを配信する必要がある) などのいくつかの安全な呼び出しを除いて、そこに動作することを保証するものではありません。

pcap_t異なるスレッドで同時に pcap 呼び出しを行うことがない場合は、機能するはずです。

つまり、あるスレッドでデバイス/保存ファイルを開いて を取得しpcap_t、それが完了したら、同じスレッドまたは別のスレッドに からパケットを読み取らせることができますpcap_tただし、複数のスレッドに からパケットを読み取らせることはできませんpcap_t

ただし、pcap の使用方法に何か問題がある可能性があります。これは、シングルスレッド プログラムでもクラッシュする可能性があります。そうであるかどうかを確認するには、すべての pcap 呼び出しを確認する必要があります。

于 2013-01-10T05:21:05.883 に答える