EN JA
PCAP_BREAKLOOP(3)
PCAP_BREAKLOOP(3) FreeBSD Library Functions Manual PCAP_BREAKLOOP(3)

名称

pcap_breakloop -戻るために、強制的に pcap_dispatch() または pcap_loop() を呼び出す

書式


#include <pcap/pcap.h>


void pcap_breakloop(pcap_t *);

解説

pcap_breakloop() は、ループするのではなく、強制的に pcap_dispatch() または pcap_loop() を戻るためのフラグを設定します。それらは、今までのところ処理されたパケットの数を返し、パケットが今までのところ処理されていないなら、-2 を返します。

このルーチンは、単にループ中でチェックされるフラグを設定するように、 UNIX のシグナルハンドラまたは Windows のコンソール制御ハンドラを内部で使用するために安全です。

フラグは、OS からパケットを読み込むループでチェックされます - OS によって返された 1 組のパケットを処理するループと同様に - それ自体によるシグナルは、必ずしもそれらのループ終了するとはいえません。利用者がシグナルの後にシステムコールを再開し、シグナルハンドラで pcap_breakloop() の呼び出しをサポートする UNIX システムでシグナルをキャッチするなら、それらのシグナルをキャッチするとき、システムコールが、そのシグナルによって再開されるべきでないことを指定しなければならないことに注意してください。そうでなければ、シグナルがライブキャプチャ (捕獲) でパケットの読み込み呼び出しを割り込んだなら、利用者のシグナルハンドラが pcap_breakloop() を呼び出した後に返るとき、呼び出しは、再開され、より多くのパケットが到着するまでループが終了せず、そして呼び出しは終了します。

また、マルチスレッドのアプリケーションにおいて、1 つのスレッドが、 pcap_dispatch(), pcap_loop(), pcap_next() または pcap_next_ex() でブロックされるなら、異なったスレッドの pcap_breakloop() への呼び出しは、そのスレッドをアンブロック (unblock) しないことに注意してください。利用者は、POSIX スレッドをサポートするシステムのスレッドのキャンセルのように、スレッドをアンブロックするために呼び出しをブロックすることからスレッドをブレークするために OS が提供するメカニズムはなんでも使用する必要があります。

いくつかのプラットフォームで、 pcap_next()pcap_next_ex() は、OS からパケットの読み込みでループすることに注意してください。そのループは、必ずしもシグナルによって終了するわけではないので、たとえ pcap_next() または pcap_next_ex() が使用されていても、 pcap_breakloop() は、パケット処理を終了するために使用されるべきです。

pcap_breakloop() は、それが呼び出された後に、これ以上のパケットが pcap_dispatch() または pcap_loop() によって処理されることを保証しません。多くても 1 つ以上のパケットが処理されるかもしれません。

pcap_dispatch() または pcap_loop() から-2 が返されるなら、フラグは、クリアされるので、その後の呼び出しで、パケットを読み込みを再開します。正の数が返されるなら、フラグはクリアされないので、その後の呼び出しは、-2 を返して、フラグをクリアします。

関連項目

pcap(3), pcap_loop(3), pcap_next_ex(3)
5 April 2008