Can';从消息队列接收后,不要使用shm_open
我尝试使用以下步骤在同一代码中实现许多IPC方法:Can';从消息队列接收后,不要使用shm_open,c,linux,ipc,message-queue,shared-memory,C,Linux,Ipc,Message Queue,Shared Memory,我尝试使用以下步骤在同一代码中实现许多IPC方法: 1-Process1打开一个消息队列并读取从Process2发送的消息 2-Process1关闭并取消消息队列的链接 3-Process1将某些内容写入共享内存 在步骤3中,任何shm_open(),memset()或memcpy()系统调用都失败,Eclipse挂起在一个新窗口中,该窗口对我调用的任何函数都显示“在***找不到源文件” 当我禁用队列接收操作并只执行共享内存时,一切正常 因此,我怀疑队列中发生了一些未完成的事务,这会阻止进程
- 1-Process1打开一个消息队列并读取从Process2发送的消息
- 2-Process1关闭并取消消息队列的链接
- 3-Process1将某些内容写入共享内存
shm_open()
,memset()
或memcpy()
系统调用都失败,Eclipse挂起在一个新窗口中,该窗口对我调用的任何函数都显示“在***找不到源文件”
当我禁用队列接收操作并只执行共享内存时,一切正常
因此,我怀疑队列中发生了一些未完成的事务,这会阻止进程的任何进一步调用
下面是代码中的问题:(刚刚添加了相关部分)
软件没有创建共享内存,而是挂起shm_open()
,并声称找不到shm_open
的源代码
memset(buffer, 0, sizeof(buffer));
这将设置buffer[0]=0
,因为sizeof(buffer)=sizeof(char*)=1
。
更好的办法是:
char buffer[33] = {0};
或
或
sizeof(buffer)/sizeof(buffer[0]
计算固定数组的大小(非指针使用malloc分配)。因此结果将是33。正如@Petesh所提到的,问题出在/*使用接收到的数据*/部分中,我从代码中省略了该部分,因为我认为它与此无关!澄清一下:在这部分中,我使用memcpy()复制的数据的大小犯了一个错误这导致了缓冲区溢出。这没有显示任何错误,但以某种方式阻止了程序的进一步处理。
谢谢大家的宝贵意见。问题描述似乎不一致。
shm_open()
调用挂起还是失败?只有在后一种情况下,才有理由说它“声称找不到shm_open的源代码”此外,您是如何确定执行甚至达到shm_open()的
call?总的来说,您必须确保检查所有方法调用的返回代码,以捕获失败代码并做出适当的反应。这将使您更好地了解发生了什么。但是,为了让我们更直接地帮助您,我们可能需要一个重现问题的方法,其中可能包括其他参与pr的代码gram.当我调试程序时,它在shm_open失败,并将我引导到“未找到源代码”窗口。如果在调用receiveFromQ()之前调用shm_open函数,则该函数工作正常。我会疯狂地猜测,您正在使用收到的数据*/破坏/*中的堆栈,因此shm_open
现在正在为键
获取一个值,这是垃圾。所示的代码不会触发该错误。它正在停止,因为调用shm_open
时发生了一些事情。请注意指示停止的原因。这可能是键
变量中的值出现SEGV(地址无效错误)。缺少源代码只是因为C运行时中没有源代码。在调用shm_open
之前输入一个断点,并验证键
变量是否正常。(或者,在键
变量的地址上放置一个写断点,并查看它何时跳闸。)这不是真的。对于char buffer[33]
,则sizeof(buffer)
是sizeof(char[33])
是sizeof(char)*33
是33
。隐式将数组类型转换为指针类型的少数例外之一是在sizeof
表达式中。我确信有些时髦的嵌入式DSP或类似体系结构的指针大小为1。OP没有使用它。缓冲区数组的大小与指向字符的指针。您似乎被Igor搞糊涂了。sizeof(buffer)
是变量buffer的sizeof。buffer变量是一个由33个char
s组成的数组。因此sizof(buffer)
是33个char
s的大小。数组(在大多数上下文中)在C语言中隐式转换为指针(这对新程序员来说是最令人困惑的)。例如sizeof(buffer+1)
就是sizeof(char*)
。+1
使buffer
隐式转换为指向char
的指针。转换后+1
不执行,编译器只需要进行类型解析。sizeof>(buffer)/sizeof(buffer[0])
是数组中计数的常用助记符。buffer
的类型是char[33]
,因此sizeof(buffer)
是33*sizeof(char)
。buffer[0]
的类型是char
,是一个char
等于sizeof(char[33])/sizeof(char)
等于33*sizeof(char)/sizeof(char)
。恰好sizeof(char)
等于1,这是标准保证的。使用memset(buffer,0,sizeof(char)*buffer(buffer)
或memset(buffer,0,sizeof(char[33]))
我相信这不是问题,因为函数工作正常,可以正确读取接收到的值。
char buffer[33] = {0};
#define BUFFER_LEN 33U
...
char buffer[BUFFER_LEN];
...
memset(buffer, 0, sizeof(char) * BUFFER_LEN);
memset(buffer, 0, sizeof(buffer) / sizeof(buffer[0]);