我正在为共享内存上的学生制作一个教程。不过,我在等待或发布信号时看到崩溃。我正在使用sem_open API来初始化信号量。在做sem_open之前我需要分配一些内存吗?它在我看来是一个分段错误。你能帮我吗?我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?

#include

#include

#include

#include

#include

/** page size **/

#include

/** memcpy **/

#include

#include

#include

using namespace std;

class READER_WRITER_A

{

private:

string msg;

void *shm_ptr;

int shm_id;

sem_t *sem_rw;

void Init_Shm();

void Init_Sem();

public:

void Read_Msg();

void Write_Msg(string s1);

READER_WRITER_A();

};

void READER_WRITER_A::Init_Shm()

{

key_t key;

key = ftok("/home/joshis1/Downloads/IPC-BLOG/shm",1);

shm_id = shmget(key, getpagesize(), IPC_CREAT| 0660);

shm_ptr = shmat(shm_id, NULL, 0660);

}

void READER_WRITER_A::Init_Sem()

{

sem_rw = sem_open("/home/joshis1/Downloads/IPC-BLOG/rw_sem", O_RDWR | O_CREAT, 0666, 0);

cout<

if(sem_rw < 0)

cout<

sem_post(sem_rw);

cout<

}

void READER_WRITER_A::Read_Msg()

{

//sem_wait(sem_rw);

int *size = (int *)shm_ptr;

void *msg_ptr = shm_ptr;

msg_ptr+=sizeof(int);

cout<

memcpy(&msg,(string *)msg_ptr,*size);

cout<

//sem_post(sem_rw);

}

void READER_WRITER_A::Write_Msg(string s1)

{

//sem_wait(sem_rw);

void *msg_ptr = shm_ptr;

msg = s1;

int *pt = (int*)shm_ptr;

*pt = s1.size();

cout<

msg_ptr+=sizeof(int);

cout<

memcpy((string *)msg_ptr,&msg,s1.size());

//sem_post(sem_rw);

}

READER_WRITER_A::READER_WRITER_A()

{

Init_Shm();

Init_Sem();

}

int main(int argc, char *argv[])

{

READER_WRITER_A val;

val.Write_Msg("I am A-RW");

val.Read_Msg();

return 0;

}

这是输出。

$ ./reader_writer_a.out

Sem_Post calling

Segmentation fault (core dumped)

这里分析coredump。

(gdb) bt

#0 0x0000003fb060d790 in sem_post() from /lib64/libpthread.so.0

#1 0x0000000000400fd0 in READER_WRITER_A::Init_Sem (this=0x7fff50e322a0) at reader_writer_a.cpp:52

#2 0x0000000000401199 in READER_WRITER_A::READER_WRITER_A (this=0x7fff50e322a0) at reader_writer_a.cpp:86

#3 0x00000000004011d8 in main (argc=1, argv=0x7fff50e323c8) at reader_writer_a.cpp:92

Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...相关推荐

  1. [转]使用 .NET Framework 2.0 在您的应用程序中支持证书

    NET 安全 使用 .NET Framework 2.0 在您的应用程序中支持证书 Dominick Baier 本文讨论: Windows 证书存储区 .NET 中的证书类 验证.SSL.Web 服 ...

  2. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

  3. 小程序如何修改缓存中的某一个字段的值;小程序中如何应用vant组件 如:van-dropdown-item、van-field

    1.小程序如何往缓存中存数据 将数据放入指定缓存中. 这里缓存块的名称叫'mydata',你可以根据自己的需求,取合适的名字.代码如下 let data = {name: '8BQ了',age: '1 ...

  4. 【解析】在高级语言源程序中, 常需要用户定义的标识符为程序中的对象命名,常见的命名对象有()

    在高级语言源程序中, 常需要用户定义的标识符为程序中的对象命名,常见的命名对象有() A.关键字 B.变量 C.函数 D.数据类型 E.注释 一个一个分析: 关键字 :虽然很多关键字都可以用过defi ...

  5. oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到

    oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到? 原因:数据库中插入数据时没有commit,执行COMMIT后就可以查询到. 转载于:https://www.cnblogs.co ...

  6. c语言中的语义错误和语法错误,C语言程序中对错误的调试

    程序调试 现在我们已经可以编写一个简单的 C语言程序了,但是你可能会犯一些简单的错误.程序的错误通常叫做 bug,而发现和修正这些错误的过程叫做调试.下面有一个带有一些错误的程序,看看你能找出多少. ...

  7. socket中的read返回0

    在socket中服务器与客户端进行通信,当其中一方调用close(即这一方会发送一个fin)关闭套接字之后,另一方read()会返回一个0. 我之前编写的一个服务器与客户端通信(一个服务器只连接一个客 ...

  8. .net linux 界面设计,.NET Core3.0开发Liunx桌面应用程序

    .NET Core3.0开发Liunx桌面应用程序主要是依靠GTK. 什么是GTK? GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发.跨平台的图形工具包.最初是为GIMP写的,已 ...

  9. 敏捷中gwt含义_在您的GWT应用程序中添加JSON功能

    敏捷中gwt含义 JSON简介 在Web应用程序上工作时,总是会出现客户端-服务器数据交换的问题. 在此问题上有多种方法,其中许多使用XML进行交换. 执行此任务的一种不太知名的格式是JSON. JS ...

最新文章

  1. php 空格用什么表示方法,php用空格代替标点符号
  2. mysql 备份需要的权限_mysqldump 备份数据库用户所需要的权限
  3. Java程序停止 mq通道未关闭_java – 如何在MQ上停止丢失消息
  4. Spark灰度发布在十万级节点上的实践
  5. 玩转你画我猜(二):更优秀的绘图程序
  6. python如何导入类里_Python中如何导入类示例详解
  7. 更新pip版本至最新
  8. 港口水域电子海图数据快速检索算法及应用
  9. 内蒙古自治区包头市谷歌高清卫星地图下载
  10. Github注册中,邮箱验证通不过解决办法
  11. 搭建基于 Docker 的 CI/CD
  12. 计算机网络重置点命令,WinXP系统如何通过cmd命令对网络进行重置
  13. 颜色空间:RGB,CMY,HSV,HSL,Lab,YUV详解
  14. qp_查看表的数据是否更新了指定的某一天数据
  15. 给你个使用NAS私有云服务器的理由
  16. BeautifulSoup案例2——抓取优美图库
  17. EA周报 | Libra将与支付宝微信展开竞争;Google终止中国版搜索引擎;滴滴柳青:顺风车目前不能上线是因为害怕...
  18. 第二章-连接到WAN
  19. 【Tushare 大数据社区——解救你的财经数据需求】
  20. Cannot download sources Sources not found for:xxx解决方法汇总

热门文章

  1. 蓝桥杯刷题冲刺 | 倒计时19天
  2. 如何获取股票外汇期货的实时行情数据和历史行情数据?
  3. surf.detectAndCompute()提取keypoint中关键点坐标
  4. Linux离线安装SVN并配置
  5. 制定带铜衬轴套零件的加工工艺,设计铣20台面的铣床夹具(含全套CAD图纸)
  6. 动态拨号器linux,Debian Linux下ADSL拨号及动态域名的使用
  7. GPRS外置模块连接电脑进行拨号上网
  8. 安卓手机游戏 纪念碑谷1+2+被遗忘海岸+艾达的梦 解锁码
  9. mysql administrator tool 1.1_MySQL Administrator
  10. ADS纯视觉感知产品设计的痛点观察