nginxとepoll

http://www.atmarkit.co.jp/ait/articles/1406/17/news013.html

メモ:
従来のWebサーバはselectやpollを使って。これらはイベントの監視に
O(n)の時間がかかる。
nginxは epollを使う。これはO(1)のオーダーで済む。


http://linuxjm.osdn.jp/html/LDP_man-pages/man7/epoll.7.html

メモ:
epollのサンプルコードは別にO(1)じゃない・・・。
epollの特徴はオプションで「エッジ判定」を指定出来ることらしい。
エッジの場合、epoll実行中に「無し→有り」と変化した場合に返り、
最初からイベントがある場合は返らない。pollは1システムコールで構成されるが、
epollはepoll_create, epoll_ctl, epoll_wait といった複数のシステムコールで構成する点こが異なる。


なお、pollの他にppollがある。これはシグナルマスクを指定できる点がpollと異なる。類似するものに selectとpselectがある。

http://linuxjm.osdn.jp/html/LDP_man-pages/man2/select.2.html




このpselectはLinuxでは適切にインプリされてないと書かれている。

http://d.hatena.ne.jp/yupo5656/20040703/p3

しかしこのコードの場合はpselectの入り口もpselectも前も区別がないから、結局同じことじゃないんだろうか・・・(悪い例4)




それとこのページの悪い例3でsiglongjmpはシグナルハンドラで使ってはいけないとある。コメント部分で質問と回答もある。
以下ではsiglongjmpで大域脱出のために使用している。

7. siglongjmp による大域脱出
http://www.oki-osk.jp/esc/linux/signal-7.html

タックオーバーフローのハンドリング (Stack Overflow Handling)
http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html

しかし、manページのsiglongjmpは、シグナルマスクを保存復帰するlongjmpであり、シグナルハンドラで使うとは書かれていない。

sigXXXXという名前からシグナルハンドラ用のlongjmptと勘違いしている可能性が微レ存?

ここ↓によると、シグナルハンドラでlongjmpを使うとダメなのは、シグナルハンドラはシグナルマスク状態で呼ばれるから、だからシグナルマスクも復帰するsiglongjmpを使え、みたいな。

http://www.programering.com/a/MjN1UTMwATg.html
https://books.google.co.jp/books?id=tdsZHyH9bQEC&pg=PA286&lpg=PA286&dq=siglongjmp+signal+handler&source=bl&ots=ruYe92n1l6&sig=IJAw7EJJSUEBnDPpAq299OyMRnc&hl=ja&sa=X&ei=cO1kVejGBIW8mQXMkoOYCg&ved=0CDIQ6AEwAzgK#v=onepage&q=siglongjmp%20signal%20handler&f=false

でもsiglongjmpはasync-signal-safeではないので、これらはよろしくないはず。

https://www.jpcert.or.jp/sc-rules/c-sig32-c.html