从消息队列接收到后无法使用shm_open

时间:2019-04-15 10:42:41

标签: c linux ipc message-queue shared-memory

我正在尝试使用以下步骤在同一代码中实现许多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的源。

2 个答案:

答案 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。