我正在尝试使用以下步骤在同一代码中实现许多IPC方法:
1-Process1打开消息队列并读取从Process2发送的消息
2-Process1关闭并取消链接消息队列
3-Process1将一些内容写入共享内存。
在第3步,任何shm_open()
,memset()
或memcpy()
系统调用都会失败,并且Eclipse会在新窗口中挂起,显示“无法在***中找到源文件”我叫什么功能。
当我禁用队列接收操作并仅执行共享内存时,一切正常。
所以我怀疑队列中正在发生一些未完成的业务,这阻止了该流程的任何进一步的呼叫
这是代码中的问题:(仅添加了相关部分)
...
static int receiveFromQ(char *msgQName)
{
int msgQFD;
char buffer[33];
/* Create and open the communication message queue */
msgQFD = mq_open(msgQName, O_RDONLY | O_CREAT, 0660, NULL);
/* Read the message from the queue and store it in the reception buffer */
memset(buffer, 0, sizeof(buffer));
mq_receive(msgQFD, buffer, sizeof(buffer), NULL); // This is a blocking point until a message is received
/* Use the data received ... */
/* Close the queue */
mq_close(msgQFD);
/* Remove the message queue */
mq_unlink(msgQName);
return 1;
}
int main(void)
{
char *key = SM_KEY;
int shmFD;
/* Receive the data from the queue */
int ret = receiveFromQ(MSGQ_NAME);
/* Creates a shared memory object in a kernel space, with size = 0 */
shmFD = shm_open(key, O_CREAT | O_RDWR | O_TRUNC, 0660); //The software stops here!
...
}
该软件没有创建共享内存,而是挂在shm_open()
上并声称找不到shm_open
的源。
答案 0 :(得分:0)
正如@Petesh所提到的,问题出在/ *使用接收到的数据* /部分,我从代码中省略了该部分,因为我认为这无关紧要!需要说明的是:在这一部分中,我对使用memcpy()复制的数据大小犯了一个错误,这导致缓冲区溢出。这没有显示任何错误,但是以某种方式阻止了程序的进一步处理。 谢谢大家的有用评论。
答案 1 :(得分:-2)
memset(buffer, 0, sizeof(buffer));
这将设置buffer[0] = 0
,因为sizeof(buffer) = sizeof(char*) = 1
。
更好的主意是:
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]);
sizeof(buffer) / sizeof(buffer[0]
计算固定数组的大小(使用malloc分配非指针)。结果将是33。