Не могу использовать shm_open после получения из очереди сообщений - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь реализовать несколько методов 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 голосов
/ 15 апреля 2019

Как уже упоминалось @Petesh, проблема заключалась в том, что / * использовать полученные данные * / часть, которую я пропустил в коде, потому что я думал, что это не имеет значения!Для пояснения: в этой части я допустил ошибку с размером данных, скопированных с использованием memcpy (), что вызвало переполнение буфера.Это не показывало никакой ошибки, но каким-то образом заблокировало дальнейшую обработку программы.Спасибо всем за полезные комментарии.

0 голосов
/ 15 апреля 2019
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.

...