zoukankan      html  css  js  c++  java
  • 自测之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
    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函数完成。

     

    实现代码:

  • 相关阅读:
    Java面试题2(转)
    Java面试题1(转)
    RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
    Java List与数组之间的转换
    JAVA面试题(3)
    JAVA面试题(2)
    JAVA面试题(1)
    SpringMVC 后台怎么获取前台jsp页面中file中的文件
    QMessageBox中按钮的汉化
    关于字符串的一些重要方法
  • 原文地址:https://www.cnblogs.com/xzxl/p/8549912.html
Copyright © 2011-2022 走看看