接外包,有相关需求的可以联系我:Telegram | Email

如何用C++在Linux中使用共享内存?

该文章创建(更新)于01/11/2023,请注意文章的时效性!

文章目录[隐藏]

顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

示例

  • 代码
/*  
@Time   : 2023/1/10 11:46 
@Author : emperinter  
@File   : test_shared_memory.py  
@desc   :  
-  
*/  
#include <sys/shm.h>  
#include <unistd.h>  
#include <iostream>  
#include <string>  
using namespace std;  

typedef void *HANDLE;  


void reader(int seq) {  
    cout << "reader " << seq << endl;  
    int shm_id = shmget((key_t) 1234, 1024, 0666 | IPC_CREAT);  
    if (shm_id == -1) {  
        perror("Fail to get shared memory id");  
        return;    }  

    // Attach to the segment to get a pointer to it.  
    char* shm_buf = static_cast<char*>(shmat(shm_id, NULL, 0));  
    if (shm_buf == nullptr) {  
        perror("Fail to attach shared memory");  
        return;    }  

    /* Transfer blocks of data from shared memory to stdout*/  
    while (1) {  
        cout << "buf[" << seq << "] = " << shm_buf << endl;  
        if (string(shm_buf) == to_string(seq)) {  
            break;  
        }  
        sleep(3);  
    }  
    cout << "Detaching shared memory" << endl;  
    if (shmdt(shm_buf) == -1) {  
        perror("Fail to detaching shared memory");  
        return;    }  
}  

void writer() {  
//    int shm_id = shmget(SHM_KEY, BUF_SIZE, IPC_CREAT);  
    int shm_id = shmget((key_t) 1234, 1024, 0666 | IPC_CREAT);  
    if (shm_id == -1) {  
        perror("Fail to get shared memory id");  
        return;    }  

    // Attach to the segment to get a pointer to it.  
    char* shm_buf = static_cast<char*>(shmat(shm_id, NULL, 0));  
    if (shm_buf == nullptr) {  
        perror("Fail to attach shared memory");  
        return;    }  
    /* Transfer blocks of data from shared memory to stdout*/  
    while (1) {  
        cin >> shm_buf;  
    }  

    cout << "Detaching shared memory" << endl;  
    if (shmdt(shm_buf) == -1) {  
        perror("Fail to detaching shared memory");  
        return;    }  
}  

int main(int argc, char* argv[]) {  
    if (argc < 2) {  
        return 0;  
    }  
    srand(::time(nullptr));  
    cout << argv[1] << endl;  
    string argv1 = argv[1];  
    if (argv1 == "reader") {  
        reader(rand() % 1000);  
    } else {  
        writer();  
    }  

    return 0;  
}
  • 开启writer

假设编译好的可执行文件为test_shared_memory

sudo ./test_shared_memory writer
  • 开启reader
 sudo ./test_shared_memory reader

参考

  • https://www.cnblogs.com/52php/p/5861372.html
  • https://blog.csdn.net/tojohnonly/article/details/70246965
  • https://www.cnblogs.com/umichan0621/p/16588431.html
  • https://blog.csdn.net/guoping16/article/details/6584058

要不赞赏一下?

微信
支付宝
PayPal
Bitcoin

版权声明 | Copyright

除非特别说明,本博客所有作品均采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明转自-
https://www.emperinter.info/2023/01/11/how-to-use-shared-memeory-in-linux-by-cpp/


要不聊聊?

我相信你准备留下的内容是经过思考的!【勾选防爬虫,未勾选无法留言】

*

*



YouTube | B站

微信公众号

👉 NewsLetter ❤️ 邮箱订阅 👈

优惠码

阿里云国际版20美元
Vultr10美元
搬瓦工 | Bandwagon应该有折扣吧?
Just My SocksJMS9272283 【注意手动复制去跳转】
域名 | namesiloemperinter(1美元)
币安 币安