linux system v 共享內存

1、共享內存的實現方式:
1.System V的shmget(基本上全部linux都含有該接口,用法上系統V共享內存是以文件的形式組織在特殊文件系統shm中的。經過shmget能夠建立或得到共享內存的標識符。取得共享內存標識符後,要經過shmat將這 個內存區映射到本進程的虛擬地址空間。)
2.posix的shm_open(缺點:經過ipcs查看不到,一些BSDs(OpenBSD and NetBSD IIRC)系統不支持,但相比shmget接口較新,且通常組合mmap使用)
3.posix的mmap
參考:
 
2、Linux輔助工具
ipcs:查看System V形式下的共享內存狀況
ipcrm:移除共享內存
ps:具體參數解釋請自行經過man查看
 
3、System V共享內存的簡單示例:
共享內存的建立和刪除:
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>
#include <cstring>

using namespace std;

#define PATH_NAME "/tmp/shm_mark"

int main(int, char**)
{
    int fd;
    fd = open(PATH_NAME, O_CREAT, 0666);
    if(fd < 0)
    {
        cout << "open file" << PATH_NAME << "failed, with errno:" << strerror(errno) << endl;
        return -1;
    }
    close(fd);

    key_t key = ftok(PATH_NAME, 0);
    int shm_ref_id;
    shmid_ds shm_info;
    int ret = 0;

    shm_ref_id = shmget(key, sizeof(int), IPC_CREAT | 0666 | IPC_EXCL);
    if(shm_ref_id < 0 )
    {
        cout << "shmget failed.." << strerror(errno) << endl;
        return -1;
    }
    cout << "shmget id:" << shm_ref_id << endl;

//    char *shmaddr = (char*)shmat(shm_ref_id, NULL, 0);
//    shmdt(shmaddr);
    ret = shmctl(shm_ref_id, IPC_RMID, 0);//&shm_info);
    cout << "shmctl ret:" << ret << endl;
    if(ret < 0)
    {
        cout << "shmctl errno:" << errno << endl;
        return -1;
    }
    cout << "shm key:0x" << hex << key << dec << endl;
    cout << "shm id:" << shm_ref_id << endl;
    cout << "shm segsz:" << shm_info.shm_segsz << endl;
    cout << "shm nattch:" << shm_info.shm_nattch << endl;
    return 0;
}

0666:設置的是共享內存的權限。html

IPC_CREAT:若發現沒有對應的共享內存建立對應指定key_t類型ipc鍵的共享內存。linux

IPC_RMID:移除指定shm_id的共享內存。ios

相關文章
相關標籤/搜索