プロセス間の通信用の共有メモリ
1説明
たとえば、カップルを例にとると、男性と女性がデートをし、2人が紙を使って情報を交換します。2人の間にテーブルがあり、テーブルの上に1枚の紙があるとすると、男性は自分の前の紙に自分の考えを書くことができます。次に、女性に直接お見せします。同じ理由で、プロセスに関しては、プロセスAとBの2つがあります。プロセスAには独自の独立したスペースがあり、プロセスBには独自の独立したスペースがあります。独立したプロセススペースは相互に通信しません。 、しかし、メモリにはパブリックメモリスペースがあり、このパブリックメモリアドレスAとBを取得できます。Aがパブリックアドレススペースへのポインタを持っている場合、ポインタは同じ物理スペースに面する可能性があります。のアドレスはAのスペースにありませんが、Aはポインタアドレスの内容を読み取ることができ、Bについても同じことが言えます。
では、共有メモリを実現するためのプログラミングのアイデアは何ですか?
- まず、共有メモリスペースがある場合はそれを作成し、直接開きます
- マッピング、共有スペースのA、Bスペースへのマッピング
- その後、データを交換することができます
- データ交換後に共有メモリを解放する
2 共有メモリのコードプロトタイプは次のとおりです。
1 #include < sys / shm.h >
2 int shmget(key_t key、size_t size、int shmflag);
//共有メモリを作成または取得します。成功した場合は共有メモリIDを返し、失敗した場合は-1を返します。
サイズ:共有メモリのサイズはメガバイト単位で調整する必要があるため、メガレベルのスペースが開きます
例:shmid = shmget(key、1024 * 4、IPC_CREAT | 0666);
3 void * shmat(int shmid、const void * shmaddr、int shmflag);
//共有メモリを現在のプロセスのアドレススペースに接続します。成功した場合は共有メモリへのポインタを返し、失敗した場合は-1を返します。
Shmid:shmid = shmget(key_t key、size_t size、int shmflag);の上にあるshmidのIDを取得します。
Shmaddr:通常は0を取り、共有メモリを自動的に配置します。
Shmflag:私たちは、一般的にもとる0 、0手段をマッピングされた共有メモリを読み書き可能です。もちろん、自分で手配することもできます
例:shmat(shmid、0,0);
4 int shmdt(void * addr);
//共有メモリから切断します:成功した場合は0を返し、失敗した場合は-1を返します
5 int shmctl(int shmid、int cmd、struct shmid_ds * buf);
//共有メモリに関する情報を削除して、スペースの占有を防ぎます。成功した場合は0を返し、失敗した場合は-1を返します。
Smd:は命令です
3例
簡単な例で練習する
shmw.c
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);
shmid = shmget(key,1024*4,IPC_CREAT|0666); // 可读可写
if(shmid == -1){ //判断是否成功,成功返回//指向共享内存的指针,失//败返回-1
printf("shmget error\n");
exit(-1);
}
shmaddr = shmat(shmid,0,0); //映射共享内存
printf("shmat ok\n");
strcpy(shmaddr,"Hello, welcome"); //映射成功后直接,把内容复制到该地址中
sleep(5); //睡眠5秒,让其他程序读
shmdt(shmaddr); //卸载共享内存
shmctl(shmid,IPC_RMID,0); //关掉共享内存
printf("quit\n");
return 0;
}
shmr.c
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);
shmid = shmget(key,1024*4,0);//获取不创建设为0
if(shmid == -1){
printf("shmget error\n");
exit(-1);
}
shmaddr = shmat(shmid,0,0);
printf("shmat ok\n");
printf("data: %s\n",shmaddr); //直接读取
shmdt(shmaddr);
printf("quit\n");
return 0;
}