2

ユーザー空間にソケットのようなオブジェクトを実装したいと思います。ポーリング可能でなければならないという重要な要件があります (つまり、select または poll 呼び出しを介して状態を照会できる必要があります)。

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

Linux には、POLLIN も POLLOUT も強制的に通知する方法がないことを除いて、ニーズに適した種類の eventfd があることを認識しています。

4

4 に答える 4

2

socketpair() を使用して、接続された AF_UNIX ソケットのペアを作成できます。これは、双方向通信を可能にするため、pipe() よりも優れています。これがニーズに合わない場合、別のオプション (デーモンに root が必要) は、まだメインラインにない Linux CUSEパッチを使用して、ユーザー空間にデバイス ドライバーを作成し、必要なことを行うことです。お気に入り。または、ユーザーが使用するイベントループにフックすることもできます...

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

これらのオプション以外に、これを行うプラットフォーム中立の方法はありません。通常のパターンでは、FIFO を使用してイベント ループを起動し、起動したら他の API を使用してポーリングします。

于 2009-05-27T04:25:09.277 に答える
1

システムコールを介してアクセスできるユーザー空間オブジェクトを構築したいですか? つまり、オープン、読み取り、書き込みなど...ユーザー空間オブジェクトにリダイレクトされますか?

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

eventfd はあなたが求めているものではなく、カーネル空間に実装されています。あなたの本当の問題を説明しましたか?fifoまたはunix ドメインソケットはあなた のニーズに合うでしょうか?

疑似 ttyはどうですか?ハードウェアのフロー制御を偽装して、マスター側からの書き込みをブロックできるかどうかはわかりません。

于 2009-05-26T08:58:06.503 に答える
0

何をしようとしているのかははっきりしません。ソケットのようなデバイスが必要な場合は、ソケットを使用しないでください。あなたは言いません...そして、POLLINとPOLLOUTとの取引は何ですか?

疑似端末デバイスの使用に興味があるのではないかと思います。man 7 pty を参照してください。

于 2009-05-26T09:36:16.893 に答える
0

pipe() を使用します。1つは書き込み用、もう1つは読み取り用の2つのfdを提供します。fd[1] を使用して選択/ポーリングを実行します。
fd[0] を使用して、アクティビティの選択/ポーリングを通知します。

于 2009-05-27T04:19:51.717 に答える