2009-05-26 4 views
2

ユーザー空間にソケットのようなオブジェクトを実装したいと思います。重要な要件は、ポーリング可能でなければならないということです(つまり、状態は選択呼び出しまたはポーリング呼び出しによって照会可能である必要があります)。ユーザー空間のファイル記述子をシミュレートする

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

Linuxでは、POLLINとPOLLOUTのどちらも通知しないようにすることはできないという点を除いて、どのようなニーズにも対応していることは知っています。

答えて

1
あなたはユーザー空間オブジェクトを構築したい

、それはシステムコールを介してアクセス可能になりますか? つまり、オープン、読み取り、書き込みなど...あなたのユーザスペースオブジェクトにリダイレクトされますか?

カーネルサポートまたはlibcサポートのいずれかが必要です。そうしないと、システムコールのリダイレクト方法がわかりません。

のeventfdは、それがカーネル空間に実装され、あなたが求めているものではありません。本当の問題を説明しましたか? fifoまたはunix domain socketがあなたの必要性を満たすことができましたか? pseudo ttyについて

何?私はあなたがハードウェアフロー制御を偽装することによってマスター側からの書き込みをブロックできるかどうかはわかりません。

+0

POLLINまたはPOLLOUTまたはその両方でポーリング呼び出しを中断したいだけです。それを達成する方法はありますか? –

0

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

疑似端末デバイスの使用に興味があると思われる場合は、man 7 ptyを参照してください。

0

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

2

あなたは接続AF_UNIXソケットのペアを作成するために、ソケットペアを()を使用することができます。双方向通信が可能なので、これはpipe()より優れています。これがあなたのニーズに合わない場合、別のオプション(デーモンのルートを必要とする)は、mainline-LinuxのままではないLinuxのCUSEパッチを使用して、ユーザスペースにデバイスドライバを作成して、好き。または、あなたのユーザーが使用する予定のループにちょうどフックすることができます...

新しいlinux eventfdはPOLLIN/POLLOUTをエミュレートすることもできますが、同時に両方ではありません - POLLINでは0xfffffffffffffffeに値を設定します。 POLLOUTではなく、POLLINであるか、またはその両方のためのものである。これらのオプション以外

は、いや、これを行うには、プラットフォームに依存しない方法はありません。通常のパターンは、単にイベントループを起こすためにFIFOを使用し、それが目覚めたら他のAPIを使用してポーリングすることです。

+0

問題は、socketpairがOUTイベントをシミュレートすることができないことです。私はローカル側に1バイトを書き込むことによってソケットペアの反対側にPOLLINを引き起こすことができますが、リモートエンドでPOLLOUTをオン/オフに切り替える方法はありません。 –

+0

残念ながら、あなたはちょっと立ち往生しています。おそらく、あなたはlkmlなどの新しいAPIを提案するべきでしょうか? – bdonlan

関連する問題