C では、共有メモリとメッセージ キューの 2 つが一般的に使用されるプロセス間通信方法です。これらは、異なるプロセス間でデータや情報を共有するのに役立ち、より効率的なプログラミングを可能にします。
共有メモリは、複数のプロセスで共有できる特別なメモリ領域です。共有メモリを使用すると、データのコピーのオーバーヘッドが回避され、プロセス間のデータ転送の遅延が軽減されます。
C で共有メモリを使用するには、
#include <sys/shm.h> #include <stdio.h> #include <stdlib.h> int main() { int shmid; char *shmaddr; shmid = shmget((key_t)1234, sizeof(char)*100, 0666 | IPC_CREAT); if(shmid == -1){ perror("shmget failed"); exit(EXIT_FAILURE); } shmaddr = (char*) shmat(shmid, (void*)0, 0); if(shmaddr == (char*)-1){ perror("shmat failed"); exit(EXIT_FAILURE); } sprintf(shmaddr, "Hello shared memory!"); printf("Message is written in shared memory: %s ", shmaddr); shmdt(shmaddr); return 0; }
上の例では、shmget 関数を使用して共有メモリを作成し、shmat 関数が共有メモリを現在のプロセスのアドレス空間に接続します。通常の変数と同じように使用できます。最後に、shmdt 関数を使用して共有メモリから切断します。shmctl 関数を使用して共有メモリの動作を制御できます。
メッセージ キューは、プロセス間でメッセージを配信できるプロセス間通信メカニズムです。その利点は、データ同期を確実にするためにロックが必要な共有メモリとは異なり、メッセージを非同期で送信できることです。 C でメッセージ キューを使用するには、
#include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ long msg_type; char msg_text[100]; } msg_buf; int main() { int msgid; msg_buf msg; msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if(msgid == -1){ perror("msgget failed"); exit(EXIT_FAILURE); } msg.msg_type = 1; strcpy(msg.msg_text, "Hello message queue!"); if(msgsnd(msgid, (void*)&msg, sizeof(msg_buf), 0) == -1){ perror("msgsnd failed"); exit(EXIT_FAILURE); } memset(&msg, 0, sizeof(msg_buf)); if(msgrcv(msgid, (void*)&msg, sizeof(msg_buf), 0, 0) == -1){ perror("msgrcv failed"); exit(EXIT_FAILURE); } printf("Message received from message queue: %s ", msg.msg_text); if(msgctl(msgid, IPC_RMID, 0) == -1){ perror("msgctl failed"); exit(EXIT_FAILURE); } return 0; }
上の例では、msgget 関数を使用してメッセージ キューを作成し、msgrcv 関数を使用してメッセージを受信し、msgsnd 関数を使用してメッセージを送信します。 msg_buf 構造体は、メッセージのタイプと内容を定義するために使用されます。最後に、msgctl 関数を使用してメッセージ キューを削除します。
一般に、共有メモリとメッセージ キューは非常に実用的なプロセス間通信方法です。マルチプロセスおよびマルチスレッドのアプリケーションでこれらの手法を使用すると、プログラムの同時実行性と効率が向上し、複雑な同期と非同期の問題が軽減されます。
以上がC++ での共有メモリとメッセージ キューの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。