ユーザーがネットワークをスキャンできるGUIプログラムがありますが、pcap_loop関数が呼び出されたときにGUIプログラムが応答しなくなるという問題があります(pcap_loopが現在のスレッドをブロックします)。スレッディングとpcapの問題
私はpthreadsを使用しようとすると、pcap_loop関数でSIGSEGVフォルトが発生しました。なぜですか?スレッドがprocPacket関数自体を見ることができないかのようです。
ユーザーがネットワークをスキャンできるGUIプログラムがありますが、pcap_loop関数が呼び出されたときにGUIプログラムが応答しなくなるという問題があります(pcap_loopが現在のスレッドをブロックします)。スレッディングとpcapの問題
私はpthreadsを使用しようとすると、pcap_loop関数でSIGSEGVフォルトが発生しました。なぜですか?スレッドがprocPacket関数自体を見ることができないかのようです。
"&"ははるかに少ない必要があります。 &handle
を使用するタイプpcap_t **
であることが、あなたのスレッド機能は、それを使用した場合、未定義の動作につながる、pcap_t *
に(ちなみにキャストは、冗長/無意味である)、それをバックキャスト、および通常ます
pcap_t *handle = pcap_open_live(...);
を想定すると、間違って行くだろう。ベター:
static void *pcap_looper(void *arg) { pcap_t *handle = arg; /* etc. */ return NULL; } int main(void) { pcap_t *handle; pthread_t tid; int ret; handle = pcap_open_live(...); ret = pthread_create(&tid, NULL, pcap_looper, handle); ... pthread_join(tid, NULL); return EXIT_SUCCESS; }
あなたは絶対に持っていない限り、私は強くスレッドを使用していないお勧めします。
問題は、競合状態やその他の同期の問題を避けるために非常に注意する必要があることです。例えば、あなたのGUIフレームワークライブラリは、おそらく複数のスレッドから呼び出されることを期待していないので、あなたの//show packets here
ルーチンはそれをたくさん混乱させるかもしれません。
代わりに、可能であれば、メインスレッドからパケットを読み取ることをお勧めします。使用しているGUIフレームワークについては言わないでください。あなたはC++を使用しているので、Qtはかなり一般的ですが、他のすべてのフレームワークも同様の機能を持っています。
何をする必要がある:
は(あなたのコードは、現在のクラッシュである理由を - あなたは、おそらくpthread_create()
にパラメータとしてhandler
ではなく&handler
を渡したいことに注意してくださいしかし、単にそれは、後に奇妙な信頼性の欠如につながる可能性が固定 - 。そうシングルスレッド起こっていますほぼ確実に前進する方法!)