あるソフトウェアプロセスを別のソフトウェアプロセスと通信させることは、微妙なバランスを取る行為です。ただし、これはアプリケーションにとって不可欠な機能である可能性があるため、複雑なプロジェクトに着手するプログラマーが解決しなければならない問題です。アプリケーションが他の誰かのソフトウェアによって処理されているジョブを開始する必要があるかどうか。周辺機器またはネットワークを介して実行されているアクションを監視するため。または、他のソースからの信号を検出するために、ソフトウェアが次に何をすべきか、いつそれを行うべきかを知るために独自のコード以外の何かに依存している場合、プロセス間通信(IPC)について考える必要があります。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
Unixオペレーティングシステムは、おそらくソフトウェアがさまざまなソースから発信されるとの初期の予想のために、これをずっと前に説明しました。同じ伝統で、LinuxはIPCといくつかの新しいインターフェースに同じインターフェースの多くを提供します。 LinuxカーネルはいくつかのIPCメソッドを備えており、util-linuxパッケージには ipcmkが含まれています。 、 ipcrm 、 ipcs 、および lsipc IPCメッセージを監視および管理するためのコマンド。
IPC情報を表示する
IPCを試す前に、システムにすでにどのIPC機能があるかを知っておく必要があります。 lsipc コマンドはその情報を提供します。
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI Number of message queues 32000 0 0.00%
MSGMAX Max size of message (byt.. 8192 - -
MSGMNB Default max size of queue 16384 - -
SHMMNI Shared memory segments 4096 79 1.93%
SHMALL Shared memory pages 184[...] 25452 0.00%
SHMMAX Max size of shared memory 18446744073692774399
SHMMIN Min size of shared memory 1 - -
SEMMNI Number of semaphore ident 32000 0 0.00%
SEMMNS Total number of semaphore 1024000.. 0 0.00%
SEMMSL Max semaphores per semap 32000 - -
SEMOPM Max number of operations p 500 - -
SEMVMX Semaphore max value 32767 - -
このサンプルリストには、メッセージ(MSG)、共有メモリ(SHM)、およびセマフォ(SEM)の3種類のIPCメカニズムが含まれています。それぞれがLinuxカーネルで使用できます。 ipcs を使用して、これらの各サブシステムの現在のアクティビティを表示できます。 コマンド:
$ ipcs
------ Message Queues Creators/Owners ---
msqid perms cuid cgid [...]
------ Shared Memory Segment Creators/Owners
shmid perms cuid cgid [...]
557056 700 seth users [...]
3571713 700 seth users [...]
2654210 600 seth users [...]
2457603 700 seth users [...]
------ Semaphore Arrays Creators/Owners ---
semid perms cuid cgid [...]
これは、現在メッセージまたはセマフォ配列がないことを示していますが、いくつかの共有メモリセグメントが使用されています。
これらのシステムの1つが機能していることを確認できるように、システムで実行できる簡単な例があります。これにはいくつかのCコードが含まれるため、システムにビルドツールが必要です。ソースコードからビルドできるようにするためにインストールする必要のあるパッケージの名前は、ディストリビューションによって異なるため、詳細についてはドキュメントを参照してください。たとえば、Debianベースのディストリビューションでは、WikiのBuildingTutorialセクションでビルド要件について学ぶことができます。また、Fedoraベースのディストリビューションでは、ドキュメントのソースセクションからのソフトウェアのインストールを参照してください。
システムにはすでにデフォルトのメッセージキューがありますが、 ipcmkを使用して独自のメッセージキューを作成できます コマンド:
$ ipcmk --queue
Message queue id: 32764
簡単にするためにキューIDにハードコーディングして、簡単なIPCメッセージ送信者を記述します。
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
strcpy(message.text,"opensource.com");
msgsnd(msqid, &message, sizeof(message), 0);
printf("Message: %s\n",message.text);
printf("Queue: %d\n",msqid);
return 0;
}
アプリケーションをコンパイルして実行します:
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769
メッセージキューにメッセージを送信しました。 ipcsで確認できます コマンド、-queueを使用 メッセージキューへの出力を制限するオプション:
$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x7b341ab9 0 seth 666 0 0
0x72bd8410 32764 seth 644 24 1
これらのメッセージは、次のコマンドで取得することもできます:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
msgrcv(msqid, &message, sizeof(message),0,0);
printf("\nQueue: %d\n",msqid);
printf("Got this message: %s\n", message.text);
msgctl(msqid,IPC_RMID,NULL);
return 0;
コンパイルして実行する:
$ gcc get.c -o get.bin
$ ./get.bin
Queue: 32764
Got this message: opensource.com
これは、Opensource.comからダウンロード可能な最新の無料(およびクリエイティブコモンズ)の電子書籍である、Linuxでのプロセス間通信に関するMartyKalinのガイドで利用できるレッスンの一例にすぎません。ほんの数回の短いレッスンで、メッセージキュー、共有メモリとセマフォ、ソケット、信号などからIPCのPOSIXメソッドについて学習します。マーティの本に腰を下ろすと、知識の豊富なプログラマーが現れます。ただし、これは経験豊富なコーダーだけのものではありません。シェルスクリプトだけを作成する場合は、パイプ(名前付きおよび名前なし)と共有ファイルに関する実践的な知識が豊富にあり、共有ファイルを使用するときに知っておく必要のある重要な概念もあります。または外部メッセージキュー。
動的でシステムに対応するように作成された優れたソフトウェアの作成に興味がある場合は、IPCについて知っておく必要があります。この本をガイドにしてください。