ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c-异步共享内存读/写

2019-11-21 09:00:38  阅读:307  来源: 互联网

标签:shared-memory semaphore c-3 linux c-4


在我的应用程序中,我正在使用父级和子级之间的IPC共享内存(在Linux和Windows上). Linux的完整代码为https://github.com/devendermishra/SharedMemoryTest/blob/master/shmem_linux.cpp

我在Linux上有以下代码可从共享内存中读取:

char buf[BUF_SIZE/4];
//pBuf is the shared memory location

sem_wait(semn);
//Wait for the parent process to write on the shared memory.
memcpy(buf, pBuf, sizeof(buf));
//Signal the parent
sem_post(sem0);

编写以下代码:

//Data is in buf, pBuf is shared memory.
memcpy(buf, pBuf, sizeof(buf));
sem_post(semn);
sem_wait(sem0);

在这种情况下,如果一个进程长时间不写入,则另一个进程将无限期等待.一种解决方案是,如果无法完成操作,则使用sem_trywait立即返回.但是在这种情况下,需要再次调用sem_trywait来检查它是否可以被锁定.像文件一样,是否有类似的机制来选择或轮询以检查多个信号量的状态,并且如果有人发出信号,则执行操作而不是被单个信号量阻塞?

解决方法:

Posix信号量没有类似于轮询的机制.

我会用烟斗;它由常规文件描述符管理,因此您可以使用poll等它.

最简单的用途是通过所有数据而不是共享内存.如果将数据复制进出内核内存的开销很成问题,那么您可以保留共享内存,并通过管道将单个字符作为信号发送,从而有效地将其用作信号量.

标签:shared-memory,semaphore,c-3,linux,c-4
来源: https://codeday.me/bug/20191121/2050819.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有