2


2

ユーザー空間にソケットのようなオブジェクトを実装したいです。 それがポーリング可能であるべきであるという重要な要件があります(すなわち その状態はselectまたはpoll呼び出しによって問い合わせ可能であるべきです)。

そのようなオブジェクトを実装するプラットフォームに中立的な方法はありますか?

Linuxでは、POLLINもPOLLOUTもシグナル化しないように強制する方法がないことを除けば、ニーズに合ったeventfdがあることを私は知っています。

4 Answer


2


socketpair()を使用すると、接続されたAF_UNIXソケットのペアを作成できます。 双方向通信を可能にするので、これはpipe()よりも優れています。 これで十分でない場合は、もう1つの選択肢(デーモンにrootが必要)で、まだメインラインに入っていないLinuxを使用することです。http://lkml.org/lkml/2009/4 / 13/369 [CUSE]ユーザ空間にデバイスドライバを作成して好きなことをするためのパッチ。 あるいは、ユーザーが使用する予定のイベントループにフックすることもできます。

新しいlinux eventfdもPOLLIN / POLLOUTを同時にエミュレートすることはできません - POLLINではなく、POLLOUTでは0xfffffffffffffe、POLLOUTではなくPOLLINでは0、またはその両方に値を設定します。

これらのオプション以外に、これを行うためのプラットフォームに依存しない方法はありません。 通常のパターンは、イベントループを起こすためだけにFIFOを使用し、起きたら他のAPIを使用してポーリングさせることです。


1


あなたはユーザ空間オブジェクトを構築したいです、それはシステムコールを通してアクセス可能になるでしょうか? すなわち開く、読む、書くなど…​ あなたのユーザースペースオブジェクトにリダイレクトされますか?

カーネルサポートかlibcサポートのどちらかが必要です。そうでなければシステムコールをリダイレクトする方法がわかりません。

eventfdはあなたが求めているものではなく、カーネル空間に実装されています。 あなたはあなたの本当の問題を説明しましたか? あなたの必要性に合うでしょうか。

http://man-wiki.net/index.php/7:pty[pseudo tty]はどうですか。 ハードウェアフロー制御を偽造することによって、マスター側からの書き込みをブロックできるかどうかわかりません。


0


あなたが何をしようとしているのかは、実際には明確ではありません。あなたがソケットのようなデバイスが欲しいなら、なぜソケットを使わないのですか? あなたは言わないで…​ そして、POLLINとPOLLOUTとの関係は何ですか?

疑似端末装置を使うことに興味があるかもしれません、man 7 ptyを見てください。


0


pipe()を使用してください。 それはあなたに2つのfd、1つを書くため、もう1つを読むために与えます。 選択/ポーリングを行うには、fd [1]を使用してください。 fd [0]を使用して、アクティビティの選択/ポーリングを知らせます。