2017-05-30 20 views
0

私はLinuxの初心者です。 私は2つのユーザー空間プロセスAとBを持っており、BはAからのメッセージを受信し、何らかの処理を行い、完了したらAckを受けなければなりません。だから、私は双方向のメッセージングプロトコルを見ていて、ユーザーとカーネルの間の通信にネットリンクが使用されているのを見ていました。 2つのユーザー空間プロセス通信にnetlinkを使用する方法はありますか?2つのユーザスペースプロセス間でプロセス間通信(IPC)にnetlinkを使用する方法はありますか?

これは理想的な解決策ではない場合、これを達成する他の方法はありますか?私はメッセージ待ち行列を見ていましたが、一方向の通信メカニズムのようです。

答えて

0

カーネル内のコードが最初にset up the channelになっていると仮定すると、kernel⇆kernel、kernel⇆user、およびuser⇆userの通信に汎用netlinkを使用することができます。 libnlソースには、libnl/tests/test-genl.cという例があります。この例は、カーネルにメッセージを送信し、メッセージをカーネルから受信します。もう一方のエンドポイントが別のユーザースペースプロセスであった場合も同じように機能します。

しかし、ユーザーのユーザー通信にUNIXドメインソケットまたはD-Busを使用する方がはるかに簡単です。

+0

ありがとうございます!コメントを見れば、Unix Domain Socketsが私の場合より良い解決策になるはずです。私はそれを見ていきます。 – HackX123

0

Netlinkはもともとカーネルとユーザー間の通信を提供するように設計されています。ユーザー空間とユーザー空間のコミュニケーションに使用できない理由はありませんが、なぜそうなったのか分かりません。

あなたが先に進んで使いたい場合は、ユーザー空間でのみ行うことができます。カーネル空間の設定を最初に実行する必要はありません。 AF_NETLINKのソケットファミリを使用してsocket()を呼び出してください。メッセージを送信するには、struct sockaddr_nlに値を設定し、nl_pidプロパティを適切に設定します(通常は現在のプロセスのPIDに設定されます)。次にsendto()を呼び出します。標準のrecv()呼び出しを使用してメッセージを受信できます。

あなたはあなたがLinuxに慣れていないと言いますが、ユーザスペースのIPCニーズに合ったUnixドメインソケットを見ることをお勧めします。また、場合によってはうまくいくメッセージキューを見ることもできます。ここで良い比較があります:Which is better for local IPC, POSIX message queues (mqueues) or Unix domain (local) sockets?。 POSIXメッセージキューを使用するには、リアルタイムライブラリ(librt)にリンクする必要があることに注意してください。メッセージキューを使用する双方向通信は、各方向に1つのキューのペアを使用して簡単に実現できます。

+0

詳細をお寄せいただきありがとうございます!私は間違いなく私の目的のためにUnix Domain Socketsを見ていきます。 – HackX123

関連する問題