Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';从消息队列接收后,不要使用shm_open_C_Linux_Ipc_Message Queue_Shared Memory - Fatal编程技术网

Can';从消息队列接收后,不要使用shm_open

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挂起在一个新窗口中,该窗口对我调用的任何函数都显示“在***找不到源文件” 当我禁用队列接收操作并只执行共享内存时,一切正常 因此,我怀疑队列中发生了一些未完成的事务,这会阻止进程

我尝试使用以下步骤在同一代码中实现许多IPC方法:

  • 1-Process1打开一个消息队列并读取从Process2发送的消息

  • 2-Process1关闭并取消消息队列的链接

  • 3-Process1将某些内容写入共享内存

在步骤3中,任何
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]);