共享内存:
步骤1:创建/打开共享内存。
步骤2:映射。
步骤3:读写数据。
步骤4:释放共享内存。
步骤5:删除共享内存。
查看系统中共享内存可以使用:ipcs -m。
删除系统中的共享内存可以使用:ipcm -m ****(共享内存的id号)
创建和写入数据的进程:
#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include <unistd.h>
// int shmget(key_t key, size_t size, int shmflg);
// void *shmat(int shmid, const void *shmaddr, int shmflg);
// int shmdt(const void *shmaddr);
// int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
key_t key;
key = ftok(".",0); //利用ftok生成键值
char *shmaddr;
char shmsg[128] = "cao hai";
int shmId = shmget(key,1024*4,IPC_CREAT|0666); //创建/打开共享内存,第二个参数为共享内存的大小,通常以Mbit作为单位进行开辟,
//第三个参数为创建标志,0666是为该共享内存设置为可读可写类型。
if(shmId == -1){
printf("shmget failure\n");
exit(-1);
}
shmaddr = shmat(shmId,0,0); //将共享内存映射储存空间第二个参数通常使用0让系统自动为共享内存分配空间,
//第三个参数使用0,代表映射的共享内存为可读可写
printf("shmat success\n");
strcpy(shmaddr,shmsg); //写入数据进入共享内存
sleep(5); //为别的进程读取数据时间,防止在其他进程读取数据之前或者读取数据的时候共享内存被卸载删除
shmdt(shmaddr); // 释放共享内存
shmctl(shmId,IPC_RMID,0); //删除共享内存
printf("quit\n");
return 0;
}
读取数据的进程:
#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
// int shmget(key_t key, size_t size, int shmflg);
// void *shmat(int shmid, const void *shmaddr, int shmflg);
// int shmdt(const void *shmaddr);
// int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
key_t key;
key = ftok(".",0);
char *shmaddr;
char shmsg[128];
int shmId = shmget(key,1024*4,0); //读数据的进程第三个参数设置为0,以读的方式打开。
if(shmId == -1){
printf("shmget failure\n");
exit(-1);
}
shmaddr = shmat(shmId,0,0); //映射进程存储空间。
printf("read from shm: %s",shmaddr);
shmdt(shmaddr); //释放共享内存,由于在写入数据的进程中已经删除掉共享内存因此读进程不需要再进行删除。
printf("quit");
return 0;
}
共享内存使用时,两个进程同时写的时候就会发生错乱,为了控制某一进程写数据时其他进程不会同时进行写入,引入信号。