题目:创建一个64K的共享内存。
实现代码:
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #define MEM_SIZE 0x10000 // 设置创建的共享内存大小为64K int main() { key_t key; key = ftok("a", 1); if (key == -1) { perror("fail ftok"); return -1; } int shmid; shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664); if (shmid == -1) { perror("fail shmget"); return -1; } // 打印共享内存的id和key值 printf("key:%#x shmid:%d ", key, shmid); return 0; }
题目:分别完成一个向共享内存读/写的程序,要求这两个程序指向同一共享内存。
实现代码:
/* 写共享内存 */
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #define MEM_SIZE 0x10000 // 64K 共享内存大小 #define SEG_SIZE 0x100 // 256b 分块大小 int main() { key_t key; char szBuf[256]; key = ftok("a", 1); if (key == -1) { perror("fail ftok"); return -1; } int shmid; shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664); if (shmid == -1) { perror("fail shmget"); return -1; } printf("key:%#x shmid:%d ", key, shmid); // shmat() 返回共享内存映射到内存的某一地址 char *addr; addr = shmat(shmid, NULL, 0); if (addr == (char *)-1) { perror("fail shmat"); return -1; } printf("share memory addr:%p ", addr); // 写共享内存 int offset = 0; while(1) { fprintf(stderr, "[Write]:"); // scanf("%s", szBuf); 不能读入空格 read(STDIN_FILENO, szBuf, 256); if (offset == MEM_SIZE / SEG_SIZE) { printf("Share Memory is full! "); break; } else { memcpy(addr + SEG_SIZE * offset, szBuf, SEG_SIZE); // 将szBuf的值copy到共享内存 offset++; } } shmdt(addr); return 0; }
/* 读共享内存 */ #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #define MEM_SIZE 0x10000 // 64K 共享内存大小 #define SEG_SIZE 0x100 // 256b 分块大小 int main() { key_t key; char szBuf[256]; key = ftok("a", 1); if (key == -1) { perror("fail ftok"); return -1; } int shmid; shmid = shmget(key, MEM_SIZE, IPC_CREAT | 0664); if (shmid == -1) { perror("fail shmget"); return -1; } printf("key:%#x shmid:%d ", key, shmid); // shmat() 返回共享内存映射到内存的某一地址 char *addr; addr = shmat(shmid, NULL, SHM_RDONLY); if (addr == (char *)-1) { perror("fail shmat"); return -1; } printf("key:%#x shmid:%d ", key, shmid); // shmat() 返回共享内存映射到内存的某一地址 char *addr; addr = shmat(shmid, NULL, SHM_RDONLY); if (addr == (char *)-1) { perror("fail shmat"); return -1; } printf("share memory addr:%p ", addr); //打印共享内存映射到的内存地址 // 读共享内存 int offset; while(1) { fprintf(stderr, "[Read Seg-index]:"); scanf("%d", &offset); if (offset == MEM_SIZE / SEG_SIZE) { printf("Read over edge! "); break; } else { memcpy(szBuf, addr + SEG_SIZE * offset, SEG_SIZE); printf("->%s ", szBuf); } } shmdt(addr); return 0; }
题目:完成一个读取系统当前共享内存区使用情况的程序,要求使用shmctl函数完成。
实现代码: