ユーザー空間にソケットのようなオブジェクトを実装したいと思います。ポーリング可能でなければならないという重要な要件があります (つまり、select または poll 呼び出しを介して状態を照会できる必要があります)。
そのようなオブジェクトを実装するプラットフォーム中立的な方法はありますか?
Linux には、POLLIN も POLLOUT も強制的に通知する方法がないことを除いて、ニーズに適した種類の eventfd があることを認識しています。
ユーザー空間にソケットのようなオブジェクトを実装したいと思います。ポーリング可能でなければならないという重要な要件があります (つまり、select または poll 呼び出しを介して状態を照会できる必要があります)。
そのようなオブジェクトを実装するプラットフォーム中立的な方法はありますか?
Linux には、POLLIN も POLLOUT も強制的に通知する方法がないことを除いて、ニーズに適した種類の eventfd があることを認識しています。
socketpair() を使用して、接続された AF_UNIX ソケットのペアを作成できます。これは、双方向通信を可能にするため、pipe() よりも優れています。これがニーズに合わない場合、別のオプション (デーモンに root が必要) は、まだメインラインにない Linux CUSEパッチを使用して、ユーザー空間にデバイス ドライバーを作成し、必要なことを行うことです。お気に入り。または、ユーザーが使用するイベントループにフックすることもできます...
新しい linux eventfd は POLLIN/POLLOUT もエミュレートできますが、両方を同時にエミュレートすることはできません。その値を、POLLIN の場合は 0xfffffffffffffffe、POLLOUT の場合は 0xfffffffffffffffe、POLLOUT の場合は POLLIN の場合は 0、または両方の場合はその他の値に設定します。
これらのオプション以外に、これを行うプラットフォーム中立の方法はありません。通常のパターンでは、FIFO を使用してイベント ループを起動し、起動したら他の API を使用してポーリングします。
システムコールを介してアクセスできるユーザー空間オブジェクトを構築したいですか? つまり、オープン、読み取り、書き込みなど...ユーザー空間オブジェクトにリダイレクトされますか?
カーネル サポートまたは libc サポートのいずれかが必要です。そうしないと、システム コールをリダイレクトする方法がわかりません。
eventfd はあなたが求めているものではなく、カーネル空間に実装されています。あなたの本当の問題を説明しましたか?fifoまたはunix ドメインソケットはあなた のニーズに合うでしょうか?
疑似 ttyはどうですか?ハードウェアのフロー制御を偽装して、マスター側からの書き込みをブロックできるかどうかはわかりません。
何をしようとしているのかははっきりしません。ソケットのようなデバイスが必要な場合は、ソケットを使用しないでください。あなたは言いません...そして、POLLINとPOLLOUTとの取引は何ですか?
疑似端末デバイスの使用に興味があるのではないかと思います。man 7 pty を参照してください。
pipe() を使用します。1つは書き込み用、もう1つは読み取り用の2つのfdを提供します。fd[1] を使用して選択/ポーリングを実行します。
fd[0] を使用して、アクティビティの選択/ポーリングを通知します。