Linuxでファイルをepoll()?
そろそろMatchaのIPC実装の目処をつけようかと、実験コードを書き始める。
Matchaの基本コンセプトとしてユーザスペースでのポーリングを極力抑えるというものがある。で、デバイス関係はデスクリプタをまとめてepoll()で待つという実装をしている。
IPCにはメッセージパッシングやブリテンボードなどいくつかのモデルがあるが、ブリテンボードについてはRAMディスク上のファイルで実装しようかと思ってた。epoll()のトリガでflock()でRCUなら楽勝だろうと。
で、実験コードを書いたが動かない。/dev/shmの下にopenしたファイルに1プロセスが連続してwrite()、複数プロセスがread()するというもの。flock()はうまく動いているらしいがepoll_ctl()で読み出すデスクリプタにEPOLLINを指定するところでEPERMが発生する。
man epoll_ctlを読むと、対象ファイルがepoll()に対応していない時にEPERMが発生するらしい。ちなみに物理ファイルでやってみても同様だった。
なにかしらファイルデスクリプタに対する知識が欠けているらしい。もうちょい調べる。
#FUSEならなんでもできそうだが、Linuxの機能を活用しつつUNIXライクなOS間での移植の余地を残すという技術チャレンジには反するので当面却下。
(追記)
#共有ロック・排他ロックの組み合わせはRCUとは言わないらしい。