Я пытаюсь реализовать несколько методов 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
не найден.