Linux共享内存 封装

01 Show me the code

#include <sys/shm.h>
#include <unistd.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>


// 申请共享内存,并返回其标志符号,如果该符号已经存在则报错
const int create_shm_flag(const int INDEX, const unsigned int LENGTH) {
    // 获取一个key
    key_t key = ftok("./", INDEX);
    // 由该key开辟共享内存,并获取其标识符
    const int FLAG = shmget(key, LENGTH, IPC_CREAT | IPC_EXCL | 0666);
    assert(FLAG >= 0);

    return FLAG;
}

// 申请共享内存,并返回其标志符号,如果该符号已经存在则返回其值
const int get_shm_flag(const int INDEX, const unsigned int LENGTH) {
    // 获取一个key
    key_t key = ftok("./", INDEX);
    // 由该key开辟共享内存,并获取其标识符
    const int FLAG = shmget(key, LENGTH, IPC_CREAT | 0666);
    assert(FLAG >= 0);

    return FLAG;
}


int main() {
    // 在共享内存上定义一个int变量
    const int FLAG_X = create_shm_flag(111, sizeof(int));
    int* x = (int*)shmat(FLAG_X, NULL, SHM_R | SHM_W);

    // 创建子线程
    int id = fork();
    assert(id >= 0);

    // 父进程完成共享内存变量加1,子进程在父进程修改后进行输出
    if (id > 0) {  // 父进程
        (*x) += 1;
        printf("pid= %d, x_address= %x, x= %d\n", getpid(), x, *x);
    } else {       // 子进程
        // 确保父进程完成累加操作
        usleep(100);
        printf("pid= %d, x_address= %x, x= %d\n", getpid(), x, *x);
    }

    // 父进程销毁共享内存
    if (id > 0) {
        // 确保子进程输出前共享内存不会被销毁
        sleep(1);
        // 销毁
        shmctl(FLAG_X, IPC_RMID, NULL);
    }

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值