1 年前、私はこのトピックに関する調査を書きました。その一部を次に示します。
2 Unix IPC メカニズム
Unix IPC メカニズムには次のものがあります。
- Unix シグナル。
- Unix パイプ。
- Unix ドメインソケット。
同時に、Unix System-V IPC メカニズムは Android には含まれていません。Bionic は、semget()、shmget()、msgget() によって提供されるような System-V IPC メカニズムのサポートを意図的に提供していません。この理由は、サービス拒否を避けるためです [11]。
2.1 Unix シグナル
Unix シグナルがどのように機能するかについての最良の説明の 1 つは、ウィキペディアで見つけることができます。基本的には、発生したイベントをプロセスに通知するためにプロセスに送信される非同期通知です。シグナルがプロセスに送信されると、オペレーティング システムはプロセスの通常の実行フローを中断します。非アトミック命令の実行中は、実行を中断できます。プロセスが以前にシグナルハンドラを登録していた場合、そのルーチンが実行されます。それ以外の場合は、デフォルトのシグナル ハンドラが実行されます。」Android プログラミングでは unix シグナルがほとんど使用されていないようです。さらに、デバッグモードでは一部の信号が無効になっています. ただし、これは可能な IPC メカニズムです。
2.2 Unix パイプ
パイプは、あるプロセスの出力ストリームを別のプロセスの入力ストリームに直接接続できるようにする通信メカニズムです。UNIX パイプには、名前付きパイプと名前なしパイプの 2 種類があります。Android プログラミングでは、名前付きパイプのみが使用されているようです。この場合、2 つのプロセスが、出力と入力を接続する特別なファイルを使用して対話します。パイプは一方向の通信方法であることに注意してください。つまり、1 つのプロセスが常にリーダーであり、2 つ目のプロセスが常にライターです。SD カードの FAT32 ではパイプを作成できないため、通信ファイルは Linux ファイルシステムで作成する必要があります。Androidで名前付き UNIX パイプを作成して使用する方法の例を次に示します(ロシア語)。この例のソース コードは、ここにあります。
2.3 Unix ドメインソケット
UNIX ドメイン ソケットは、UNIX パイプとは対照的に、サーバーからクライアントへ、およびクライアントからサーバーへの両方の方法で情報を転送できます。Unix ドメイン ソケットと UNIX パイプは、ファイル システムをアドレス名前空間として使用します。つまり、サーバーとクライアントは特別なファイルを使用して通信を確立します。Android を考えると、UNIX ドメイン ソケットのプログラミングに使用される 2 つのクラスがあります。LocalServerSocket と LocalSocket です。すべての実装はこれら 2 つのクラスを中心に構築でき、ネイティブ コードを使用して UNIX ドメイン ソケットを作成する必要はありません。unix ドメイン ソケットの使用方法の簡単な例をここに示します。
[11] Android ndk ドキュメント。android-ndk-r6b の NDK ドキュメント