共享内存
创建:2023-10-27 17:41
更新:2025-04-24 22:52

申请共享内存并写入

#include <sys/ipc.h>
#include <sys/shm.h>

int main(int argc, char const* argv[]) {
    // int shmid = shmget(7500, 1024, IPC_CREAT | IPC_EXCL);
    int shmid = shmget(7501, 1024, IPC_CREAT);
    if (shmid < 0) {
        return -1;
    }

    char* addr = (char*)shmat(shmid, NULL, 0);    //将共享内存进行挂接
    memset(addr, 0, 1024);

    int i = 0;
    while (i < 26) {
        addr[i] = 'A' + i;
        i++;
    }
    addr[i] = 0;
    shmdt(addr);    //取挂接
    return 0;
}

读取共享内存内容

#include <sys/ipc.h>
#include <sys/shm.h>

int main(int argc, char const* argv[]) {
    int shmid = shmget(7501, 1024, IPC_CREAT);
    if (shmid < 0) {
        return -1;
    }

    char* addr = (char*)shmat(shmid, NULL, 0);    //将共享内存进行挂接

    // 读取
    printf("client:%s\n", addr);

    shmdt(addr);    //取挂接
    return 0;
}

此外,还有一个用来控制共享内存的shmctl()函数如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl( int shmid , int cmd , struct shmid_ds *buf );


int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
    IPC_STAT 得到共享内存的状态
    IPC_SET 改变共享内存的状态
    IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。返回值: 成功:0,失败:-1
struct shmid_ds buf;
shmctl( shmid , IPC_STAT , &buf ); // 取得共享内存的状态
shmctl( shmid , IPC_RMID , &buf ); // 删除共享内存

在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。

ipcsipcrm命令:

取得ipc信息:
ipcs [-m|-q|-s]
    -m 输出有关共享内存(shared memory)的信息
    -q 输出有关信息队列(message queue)的信息
    -s 输出有关“遮断器”(semaphore)的信息

$ sudo ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id

$ sudo ipcrm -m 105