自测之Lesson13:共享内存

题目:创建一个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\nshmid:%d\n", 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\nshmid:%d\n", key, shmid); // shmat() 返回共享内存映射到内存的某一地址 char *addr; addr = shmat(shmid, NULL, 0); if (addr == (char *)-1) { perror("fail shmat"); return -1; } printf("share memory addr:%p\n", 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!\n"); 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\nshmid:%d\n", key, shmid);    

        // shmat() 返回共享内存映射到内存的某一地址
        char *addr;
        addr = shmat(shmid, NULL, SHM_RDONLY);  
        if (addr == (char *)-1) {
                perror("fail shmat");
                return -1; 
        }

        printf("key:%#x\nshmid:%d\n", 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\n", addr);         //打印共享内存映射到的内存地址

        // 读共享内存
        int offset;
        while(1) {
                fprintf(stderr, "[Read Seg-index]:");
                scanf("%d", &offset);
                if (offset == MEM_SIZE / SEG_SIZE) {
                        printf("Read over edge!\n");
                        break;
                }
                else {
                        memcpy(szBuf, addr + SEG_SIZE * offset, SEG_SIZE);
                        printf("->%s\n", szBuf);
                }
        }
        shmdt(addr);
        return 0;
}

 

 

题目:完成一个读取系统当前共享内存区使用情况的程序,要求使用shmctl函数完成。

 

实现代码:

posted @ 2018-03-12 16:17  GGBeng  阅读(195)  评论(0编辑  收藏  举报