Open Source Web Development Tutorials - Dev Shed
Linuxファイルとイベントポーリングインターフェース
(2009/03/10公開)
エッジトリガイベント VS. レベルトリガイベント
epoll_ctl()に渡されるeventパラメータのeventsフィールドにEPOLLETの値が設定されている場合、fdの監視はレベルトリガではなくエッジトリガです。
Unixパイプ上で交信している生産者と消費者の間で、次のようなイベントを考えてみましょう。
1.生産者はパイプ上に1KBのデータを書き込んできます。
2.消費者は、パイプ上でepoll_wait()を実行し、パイプがデータを入手して、読み取り可能になるのを待っています。
レベルトリガによる監視の場合、上記2.のepoll_wait()のコールは直ちに戻って、パイプの読み取り準備が整ったことを示します。エッジトリガによる監視の場合は、上記1.が発生するまで、コールは戻りません。すなわち、たとえepoll_wait()の呼び出し時にパイプが読み出し可能であっても、パイプ上にデータが書き込まれるまでコールは戻らないのです。
デフォルト動作はレベルトリガです。poll()やselect()はレベルトリガで動作しており、大多数の開発者が予期するのもレベルトリガです。エッジトリガ動作には、一般的にノンブロッキングを利用し、EAGAINを入念にチェックするなど、異なるプログラミング方法が必要です。
これらの用語は電気工学から来ています。レベルトリガ方式の割り込みは、信号線がアサートされるたびにかかります。エッジトリガ方式の割り込みは、信号線のアサート中、エッジの上昇や下降の変化が生じたときのみ、かかります。レベルトリガ方式の割り込みは、イベントの状態(アサートした信号線)に注目する場合に便利です。エッジトリガ方式の割り込みは、イベント自体(アサート中の信号線)に注目する場合に、便利です。
では、次回も学習を続けましょう。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








