首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏xcywt

    Linux进程间通信之共享内存

    2,编程模型:具体函数的用法可以用man手册查看(强力推荐) 进程A: writeshm.c      1) 获得key, ftok()      2) 使用key来创建一个共享内存 shmget()      6) 如果共享内存不再使用,可以使用shmctl()销毁共享内存 进程B: readshm.c        1) 获得key, ftok()        2) 使用key来获得一个共享内存 shmget int main() { // 生成一个key key_t key = ftok("./", 66); // 创建共享内存,返回一个id int shmid = shmget (key, 8, IPC_CREAT|0666|IPC_EXCL); if(-1 == shmid) { perror("shmget failed"); (key, 0, 0); if(-1 == shmid) { perror("shmget failed"); exit(1); } /

    5.1K50发布于 2018-01-11
  • 来自专栏嵌入式技术笔记

    Linux进程间通信之《共享内存》入门

    { perror("ftok"); exit(-1); } signal(SIGUSR1, handler); if ((shmid = shmget 0666 | IPC_CREAT | IPC_EXCL)) == -1) { if (errno == EEXIST) { shmid = shmget getpid(); kill(peerpid, SIGUSR1); } else { perror("shmget 0666 | IPC_CREAT | IPC_EXCL)) == -1) { if (errno == EEXIST) { shmid = shmget getpid(); kill(peerpid, SIGUSR1); } else { perror("shmget

    2.3K20发布于 2021-05-31
  • 共享内存通信效率碾压管道?System V IPC原理与性能实测

    二、信道的建立 1.创建共享内存 创建共享内存使用shmget函数,它的作用是创建或获取共享内存段的系统调用。 对于shmget的使用来说,虽然操作起来相对简单,但要完全理解其各种参数的设定则较为困难。不过接下来我会进行详细讲解。 shmget声明如下: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg) 3.shmid的作用 shmid是一个int类型,由shmget返回,在作用上和物理意义上与文件系统中的fd类似。它的作用主要是让用户找到指定的共享内存。 (_key, _size, flg); if (_shmid < 0) { ERROR("shmget"); } printf("shmget success id:%d\n",

    25910编辑于 2025-11-15
  • 来自专栏嵌入式开发圈

    Linux进程间通信(下)之共享内存实践

    共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。我们下面来分析每一个函数的用法。 1.1、创建共享内存 int shmget(key_t key, size_t size, int shmflg); 第一个参数是共享内存段的命名,shmget成功时返回一个关于key相关的标识符,用于后续的共享内存函数 其它进程也可以通过shmget函数返回值访问同一个共享内存。 shm_id是由shmget函数返回的共享内存标识;shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。最后一个参数是标志位通常都是0。 (0x66, SHM_SIZE, IPC_CREAT|0666); if(shmid < 0) { perror("shmget"); return -1

    2.4K40发布于 2020-09-14
  • 来自专栏Java架构师必看

    进程间通信学习小结(共享内存)

    系统V共享内存通过shmget获得或创建一个IPC共享 内存区域,并返回相应的标识符。 所有这一切都是系统调用shmget完成的。 二:系统V共享内存API 对于系统V共享内存,主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。 通过shmget可以创建或获得共享内存的标识符。取得共享内存标识符后,要通过shmat将这个内存区映射到本进程的虚拟地址空间(本进程内通过开辟一个内存进行映射)。 转:共享内存---shmget shmat shmdt 要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存

    1.2K20发布于 2021-03-22
  • Linux操作系统之进程间通信:共享内存

    shgget: shmget函数的作用是创建/获取共享内存段,其有三个参数,作用分别如下: key_T key:是一个共享内存段的关键标识符。 (key,4096,IPC_CREAT | IPC_EXCL |0666); if (_shmid < 0) { std::cerr << "shmget error" (_key, 4096, IPC_CREAT); if (_shmid < 0) { std::cout << "shmget error" << (_key, 4096, shmflg); if (_shmid < 0) { std::cout << "shmget error" << std (_key, 4096, shmflg); if (_shmid < 0) { std::cout << "shmget error" << std

    46710编辑于 2025-10-22
  • 来自专栏学习

    【Linux】进程间通信——共享内存

    3.共享内存的主要函数 函数 作用 shmget() 创建或获取一个共享内存段 shmat() 将共享内存附加到进程地址空间 shmdt() 解除共享内存与进程的关联 shmctl() 控制共享内存(删除 、修改权限等) 3.1.shmget() shmget表示获取共享内存,第一个参数key表示共享内存的键值,用于标识唯一的共享内存段。 shmget的第二个参数表示共享内存的大小,第三个参数表示标志位,如何创建共享内存和设置共享内存的权限。 第三个参数有特定的宏可以选择,红框框起来的是常用的两个。 用下面简图表示挂接: shmget的第一个参数shmid表示shmget的返回值,会返回一个shmid,第二个参数表示我们可以指定一个虚拟地址,挂接到指定的虚拟地址上,但是一般情况下我们都会默认使用分配的虚拟地址 通过 shmget、shmat、shmctl 等函数,Linux 系统为我们提供了灵活的共享内存操作接口。

    2.7K10编辑于 2025-02-28
  • 来自专栏全栈程序员必看

    linux多进程与进程间通信_linux共享内存进程间通信

    1、shmget函数 该函数用来创建共享内存,它的原型为: int shmget(key_t key, size_t size, int shmflg); 1.第一个参数,与信号量的semget shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1. 不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由 系统生成一个相应的共享内存标识符 (shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。 它的原型如下: void *shmat(int shm_id, const void *shm_addr, int shmflg); 第一个参数,shm_id是由shmget函数返回的共享内存标识。

    5.6K30编辑于 2022-11-07
  • 来自专栏王亚昌的专栏

    UNIX共享内存总结

    与POSIX V共享内存区对象不同的是,SYSTEM V的共享内存区对象的大小是在调用shmget创建时固定下来的,而POSIX共享内存区大小可以在任何时刻通过ftruncate修改。 内存大小 Shmopen+mmap(ms) Open+mmap Shmget 4k 1504 1470 1507 16k 6616 6201 5994 64k 25905 24391 24315 256k 内存大小 Shmopen+mmap(ms) Open+mmap(ms) Shmget(ms) 1M 5458 5447 5404 4M 21492 21447 21307 16M 90880 93685 if (shmid < 0) { printf("shmget failed, errormsg=%s errno=%d/ ) == SHMGET) { printf("shmget "); realmain(size, loop, SHMGET); }

    2.9K40发布于 2018-08-03
  • 来自专栏golang与云原生

    【k8s】多pod间通信之共享内存

    共享内存实现原理裸金属共享内存通信// 1.查看共享内存段ipcs -mipcrm -m shmid// 2.创建共享内存/* shmget() returns the identifier of the size equal to the value of size rounded up to a multiple of PAGE_SIZE *//* PC_CREAT | IPC_EXCL */int shmget create_shm(){key_t key = ftok(PATHNAME, PROJ_ID);if(key < 0){perror("ftok");return -1;}int shmid = shmget (key, 4096, IPC_CREAT | IPC_EXCL | 0666);if(shmid < 0){perror("shmget");return -2;}shm_addr = shmat(shmid (key, 4096, IPC_CREAT);if(shmid < 0){perror("shmget");return -2;}shm_addr = shmat(shmid, NULL, 0);return

    1.3K10编辑于 2024-03-21
  • 来自专栏c/c++

    【Linux】进程间通信——System V共享内存

    创建与使用   创建System V共享内存段的主要函数有shmget、shmat、shmdt和shmctl。 int shmget(key_t key, size_t size, int shmflg); 该函数用于创建一个新的共享内存段或者获取一个已有的共享内存段。 shmget返回值是一个共享内存标识符,如果出错则返回-1。 注意这个标识符不是key,而是给用户用的一个标识共享内存的标识符。 参数shmid是由shmget()返回的共享内存标识符。 参数cmd指定要执行的操作,例如IPC_RMID移除共享内存段,IPC_STAT获取共享内存段的状态等。 共享内存创建后必须挂接到进程中,获取到虚拟地址后才可以通过地址进行写入和读取 参数shmid是由shmget()返回的共享内存标识符。

    66010编辑于 2024-12-09
  • 来自专栏嵌入式项目开发

    Linux系统编程-进程间通信(共享内存)

    共享内存机制(shmget) 共享内存也是进程间(进程间不需要有继承关系)通信的一种常用手段。 shmget共享内存:多进程间进行通信。 shmget 函数用于创建或打开一共享内存段,该内存段由函数的第一个参数标识。 创建共享内存段*/ int shmid=shmget(123456,4096,IPC_CREAT); /*2. 创建共享内存段*/ int shmid=shmget(123456,4096,IPC_CREAT); /*2.

    2.5K10编辑于 2022-02-17
  • 来自专栏人人都是极客

    一文搞定 | Linux共享内存原理

    获取共享内存 要使用共享内存,首先需要使用 shmget() 函数获取共享内存,shmget() 函数的原型如下: int shmget(key_t key, size_t size, int shmflg 参数 shmflg 指定 shmget() 函数的动作,比如传入 IPC_CREAT 表示要创建新的共享内存。 函数调用成功时返回一个新建或已经存在的的共享内存标识符,取决于shmflg的参数。 关联共享内存 shmget() 函数返回的是一个标识符,而不是可用的内存地址,所以还需要调用 shmat() 函数把共享内存关联到某个虚拟内存地址上。 shmget() 函数实现 通过前面的例子可知,要使用共享内存,首先需要调用 shmget() 函数来创建或者获取一块共享内存。 shmget() 函数的实现如下: asmlinkage long sys_shmget (key_t key, int size, int shmflg) { struct shmid_kernel

    4.6K40发布于 2021-09-17
  • 来自专栏混说Linux

    一文读懂 | Linux共享内存原理

    获取共享内存 要使用共享内存,首先需要使用 shmget() 函数获取共享内存,shmget() 函数的原型如下: int shmget(key_t key, size_t size, int shmflg 参数 shmflg 指定 shmget() 函数的动作,比如传入 IPC_CREAT 表示要创建新的共享内存。 函数调用成功时返回一个新建或已经存在的的共享内存标识符,取决于shmflg的参数。 关联共享内存 shmget() 函数返回的是一个标识符,而不是可用的内存地址,所以还需要调用 shmat() 函数把共享内存关联到某个虚拟内存地址上。 shmget() 函数实现 通过前面的例子可知,要使用共享内存,首先需要调用 shmget() 函数来创建或者获取一块共享内存。 shmget() 函数的实现如下: asmlinkage long sys_shmget (key_t key, int size, int shmflg) { struct shmid_kernel

    1.3K30编辑于 2023-02-24
  • 来自专栏GitHub专栏

    一文搞定 | Linux 共享内存原理

    获取共享内存 要使用共享内存,首先需要使用 shmget() 函数获取共享内存,shmget() 函数的原型如下: int shmget(key_t key, size_t size, int shmflg 参数 shmflg 指定 shmget() 函数的动作,比如传入 IPC_CREAT 表示要创建新的共享内存。 函数调用成功时返回一个新建或已经存在的的共享内存标识符,取决于shmflg的参数。 关联共享内存 shmget() 函数返回的是一个标识符,而不是可用的内存地址,所以还需要调用 shmat() 函数把共享内存关联到某个虚拟内存地址上。 shmget() 函数实现 通过前面的例子可知,要使用共享内存,首先需要调用 shmget() 函数来创建或者获取一块共享内存。 shmget() 函数的实现如下: asmlinkage long sys_shmget (key_t key, int size, int shmflg) { struct shmid_kernel

    1.3K40发布于 2021-10-26
  • 来自专栏Linux内核那些事

    进程间通信 - 共享内存

    获取共享内存 要使用共享内存,首先需要使用 shmget() 函数获取共享内存,shmget() 函数的原型如下: int shmget(key_t key, size_t size, int shmflg 参数 shmflg 指定 shmget() 函数的动作,比如传入 IPC_CREAT 表示要创建新的共享内存。 函数调用成功时返回一个新建或已经存在的的共享内存标识符,取决于shmflg的参数。 关联共享内存 shmget() 函数返回的是一个标识符,而不是可用的内存地址,所以还需要调用 shmat() 函数把共享内存关联到某个虚拟内存地址上。 shmget() 函数实现 通过前面的例子可知,要使用共享内存,首先需要调用 shmget() 函数来创建或者获取一块共享内存。 shmget() 函数的实现如下: asmlinkage long sys_shmget (key_t key, int size, int shmflg) { struct shmid_kernel

    1.8K20发布于 2020-08-25
  • 来自专栏学习

    深入了解linux系统—— 共享内存

    创建共享内存shmget shmget系统调用,用来创建一个共享内存 可以看到,shmget一共存在三个参数:key、size、shmflg 参数size size参数表示要创建共享内存的大小; pathname:任意字符串都可以,通常情况下传递当前路径 proj_id:任意数都可以 shmget返回值 对于shmget函数,如果创建共享内存成功,就返回共享内存的标识符;如果创建失败就返回-1, 了解了shmget的参数key、size、shmflg、函数的返回值以及key值的创建;现在来简单使用shmget创建一个共享内存 #include <iostream> #include <cstdio std::cout << "shmget success" << std::endl; } 3. 还有,创建共享内存和获取共享内存只有shmget中参数标识符的差别,这是不是也可以在shm类存在一个身份标识符,来统一实现。

    80210编辑于 2025-06-09
  • 来自专栏开发与安全

    linux网络编程之System V 共享内存 和 系列函数

    以下是几个共享内存函数: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg const void *shmaddr); int shmctl(int shmid, int cmd, struct shmid_ds *buf); 功能:用来创建共享内存 原型 int shmget     char name[32];     int age; } STU; int main(int argc, char *argv[]) {     int shmid;     shmid = shmget (1234, sizeof(STU), IPC_CREAT | 0666);     if (shmid == -1)         ERR_EXIT("shmget");     STU *p; (1234, 0, 0);     if (shmid == -1)         ERR_EXIT("shmget");     STU *p;     p = shmat(shmid, NULL

    1.4K00发布于 2017-12-28
  • 来自专栏全栈程序员必看

    Linux进程间通信——使用共享内存

    1、shmget函数 该函数用来创建共享内存,它的原型为: int shmget(key_t key, size_t size, int shmflg); 第一个参数 ,与信号量的semget函数一样 ,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。 不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符( shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。 它的原型如下: void *shmat(int shm_id, const void *shm_addr, int shmflg); 第一个参数,shm_id是由shmget函数返回的共享内存标识。

    4.6K20编辑于 2022-11-01
  • 来自专栏Base_CDNKevin

    [操作系统] 进程间通信:system V共享内存

    详情:在调用 shmget 创建共享内存时指定这个值,进程可以通过它知道可用内存的大小。 shmget 函数 功能:创建共享内存段 原型: int shmget(key_t key, size_t size, int shmflg); 参数: key:不同进程shm来进行通信,作为共享内存段的唯一标识 先创建共享内存 对于使用shmget函数时要传入的key值,使用ftok函数来得到要传入的key。 如何保证两个不同的进程拿到的是一块共享内存 当通过ftok得到key值并传入shmget后,即可得到一块共享内存,shmget函数的返回值就是用户层面上对于共享内存的唯一表示符。 __key); 得以验证_key即为使用shmget时传入的key。

    54510编辑于 2025-05-30
领券