мессенджер, использующий очередь сообщений и многопоточность в одной программе - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать программу обмена сообщениями в Linux, используя очередь сообщений и pthread.

Программа, которую я написал, анализирует аргументы командной строки, чтобы получить идентификаторы очередей сообщений, такие как

user1) ./msg 4321 1234 // snd_key: 4321, rcv_key: 1234 

user2) ./msg 1234 4321 // snd_key: 1234, rcv_key: 4321

и затем он создает две очереди сообщений: одну для отправки, а другую для получения сообщений. Затем он запускает поток для запуска sender (), передавая & snd_queue в качестве аргумента и получателя аналогичным образом. Затем я закончил программу, ожидая двух дочерних потоков, используя pthread_joing, а затем освободил две очереди сообщений.

Проблема в том, что я не вижу входящих сообщений с помощью двух терминалов. (Я вижу только сообщение, которое я печатаю). Кроме того, при написании команды "quit" (которая должна завершить программу) выдается ошибка сегментации (сбрасывается ядро).

Я не могу понять, в чем заключается ошибка в моей программе (нет ошибок компиляции)

1 Ответ

0 голосов
/ 06 апреля 2020
pthread_create(&thread_send, NULL, sender(&snd_queue), NULL);
pthread_create(&thread_recv, NULL, receiver(&rcv_queue), NULL);

Обе эти строки недействительны. Первая строка выполняет функцию sender, а затем, после ее выхода, вы создаете поток с функцией, возвращающей значение. Поскольку возвращаемое значение sender равно return 0;, вы возвращаете NULL, поэтому я надеюсь, что pthread_create завершится неудачно с EINVAL. Вы хотите передать указатель на функцию для создания потока, а также хотите проверить возвращаемое значение.

// error() is a GNU extension from `#include <error.h>

int err = pthread_create(&thread_send, NULL, sender, &snd_queue);
if (err) { error(-1, err, "pthread_create sender failed"); }

err = pthread_create(&thread_recv, NULL, receiver, &rcv_queue);
if (err) { error(-1, err, "pthread_create receiver failed"); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...