#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
/*
int shm_open(const char *name, int oflag, mode_t mode);
//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
1.name:共享内存区的名字;
2.标志位;open的标志一样
3.权限位
编译时要加库文件-lrt
*/
#define SHM_NAME "shm_ram"
#define FILE_SIZE 4096
#define WRITE_STR "to be or not to be"
int main(int argc, char **argv)
{
int param = 0;
int ret = -1;
int fd = -1;
char buf[4096] = {0};
void* map_addr = NULL;
if (argc < 2) {
printf("param error\n");
goto _OUT;
}
param = atoi(argv[1]);
//创建或者打开一个共享内存
fd = shm_open(SHM_NAME, O_RDWR|O_CREAT, 0644);
if(-1 == (ret = fd))
{
perror("shm failed: ");
goto _OUT;
}
//调整确定文件共享内存的空间
ret = ftruncate(fd, FILE_SIZE);
if(-1 == ret)
{
perror("ftruncate faile: ");
goto _OUT;
}
//映射目标文件的存储区
map_addr = mmap(NULL, FILE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(NULL == map_addr)
{
perror("mmap add_r failed: ");
goto _OUT;
}
if (param > 10) { // read
memcpy(buf, map_addr, sizeof(buf));
printf("read: %s\n", buf);
} else { // write
memcpy(map_addr, WRITE_STR, strlen(WRITE_STR));
printf("write: %s\n", WRITE_STR);
}
//取消映射
ret = munmap(map_addr, FILE_SIZE);
if(-1 == ret)
{
perror("munmap add_r faile: ");
goto _OUT;
}
if (param > 10){
//删除内存共享
shm_unlink(SHM_NAME);
if(-1 == ret)
{
perror("shm_unlink faile: ");
goto _OUT;
}
}
_OUT:
return ret;
}
linux共享内存(shm)的测试代码
最新推荐文章于 2024-07-12 21:30:00 发布