共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg); //创建/打开共享内存
//参数一:起个名
//参数二:共享内存的大小
//参数三:打开的话填0,创建的话O_CREAT | 权限
//返回值是共享内存的shmid,-1代表出错
void *shmat(int shmid, const void *shmaddr, int shmflg);
//将共享内存挂载到进程上
//参数一:指定那个共享内存
//参数二:填NULL,让操作系统去找地方
//参数三:标志位,填0
//返回值是挂载到内存空间的地址
int shmdt(const void *shmaddr); //删除掉挂载的共享内存,但共享内存还在
//参数写shmat的返回值
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
//删除掉共享内存
示例程序:
创建共享内存:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main( void ) {
//创建共享内存
int shmid = shmget(1234, sizeof(int), IPC_CREAT|0644);
if ( shmid == -1 ) perror("shmget"),exit(1);
printf("create shared memory ok\n");
}
写程序挂载共享内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main( void ) {
//打开共享内存
int shmid = shmget(1234, 0, 0);
//挂载
int *p = (int*)shmat(shmid, NULL, 0);
int i = 0;
while ( 1 ) {
//写入
*p = i++;
printf("write %d\n", i);
sleep(1);
}
//删除挂载的共享内存
shmdt(p);
}
读程序挂载共享内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main( void ) {
//打开共享内存
int shmid = shmget(1234, 0, 0);
//挂载
int *p = (int*)shmat(shmid, NULL, 0);
while ( 1 ) {
//读取
printf("read:*p=%d\n", *p);
sleep(1);
}
//删除共享内存
shmdt(p);
}