#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。 name : 共享内存区的名字; oflag: 标志位;open的标志一样 mode : 权限位 编译时要加库文件-lrt */ #ifndef T_DESC #define T_DESC(x, y) (y) #endif #if T_DESC("TU1", 1) #define SHM_NAME "shm_ram" #define FILE_SIZE 4096 #define WRITE_STR "to be or not to be" int tu1_proc(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 "); 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 > 0) { // read memcpy(buf, map_addr, sizeof(buf)); printf("read: %s ", buf); } else { // write memcpy(map_addr, WRITE_STR, strlen(WRITE_STR)); printf("write: %s ", WRITE_STR); } //取消映射 ret = munmap(map_addr, FILE_SIZE); if(-1 == ret) { perror("munmap add_r faile: "); goto _OUT; } if (param > 0){ //删除内存共享 shm_unlink(SHM_NAME); if(-1 == ret) { perror("shm_unlink faile: "); goto _OUT; } } _OUT: return ret; } #endif #if T_DESC("global", 1) void usage() { printf(" Usage: <cmd> <tu> <p1> <...>"); printf(" 1 -- shm test"); printf(" => P1: 0 - write; 1 - read"); printf(" "); } int main(int argc, char **argv) { int ret; if(argc < 2) { usage(); return 0; } int tu = atoi(argv[1]); if (tu == 1) ret = tu1_proc(argc - 1, &argv[1]); return ret; } #endif #if T_DESC("readme", 1) /* 1, how to compile gcc -o shm.out shm.c -lrt */ #endif