Хочу освоить для одной задачи механизм Mqueue, это стандартный POSIX механизм IPC, который показался мне интересным. Отсоветуйте, если считаете его плохим, но он есть и на QNX 4 и на Linux, поэтому это портабельное решение для меня выходит.
Хочу слать сообщения, а они в другом процессе должны застревать до чтения третьим процессом, чтобы не городить два потока в программе. Выглядит всё вкусно.
Проблема вот в чем: не удается увидеть работу этого механизма, я явно что то делаю не так. Запускается сервер, открывается очередь под именем, под QNX 4 хотя бы открывается на сервере и клиенте, клиент что-то отправляет и это видно в статистике, сервер не видит данных. А под Linux попробовал - не работает и вовсе, канал не открывается.
Пробовал блокирующий и неблокирующий режим, но мне нужен неблокирующий - выстрелил и забыл. Далее код:
#include <stdio.h>
#include <mqueue.h>
char data[100000];
int main()
{
mqd_t mq;
struct mq_attr attr;
int rc;
attr.mq_flags = 0;
attr.mq_maxmsg = 100;
attr.mq_msgsize = 65536;
attr.mq_curmsgs = 0;
printf("test_mq_server\n");
//mq = mq_open("/sqlite_sdb", O_CREAT | O_RDWR | O_NONBLOCK, 0660, &attr);
mq = mq_open("/sqlite_sdb", O_CREAT | O_RDONLY, 0660, &attr);
printf("mq opened, server mq= %d\n", mq);
while(1)
{
rc = mq_receive(mq, data, 65536, NULL);
printf("server rc= %d\n", rc);
sleep(1);
}
mq_close(mq);
mq_unlink("/sqlite_sdb");
return 0;
}
#include <stdio.h>
#include <mqueue.h>
int main()
{
mqd_t mq;
char data[100000];
int rc, i;
printf("test_mq_client\n");
//mq = mq_open("/sqlite_sdb", O_RDWR | O_NONBLOCK);
mq = mq_open("/sqlite_sdb", O_WRONLY);
printf("client mq= %d\n", mq);
for(i = 0; i < 3; i++)
{
rc = mq_send(mq, "test_mq", 7, 0);
printf("client rc= %d\n", rc);
sleep(1);
}
mq_close(mq);
//mq_unlink("/sqlite_sdb");
return 0;
}
QNX4
test_mq_server
mq opened, server mq= 3
server rc= -1
server rc= -1
test_mq_client
client mq= 3
client rc= 0
server rc= -1
client rc= 0
server rc= -1
client rc= 0
server rc= -1
server rc= -1
Linux
test_mq_server
mq opened, server mq= -1
server rc= -1
server rc= -1
итого 0
------ Очереди сообщений --------
ключ msqid владелец права исп. байты сообщения
0x331100ea 0 root 622 0 0
test_mq_client
client mq= -1
client rc= -1
------ Очереди сообщений --------
ключ msqid владелец права исп. байты сообщения
0x331100ea 0 root 622 0 0
server rc= -1
client rc= -1
server rc= -1
client rc= -1
server rc= -1
server rc= -1
server rc= -1
Запускалось так
./test_mq_server &
sleep 1
./test_mq_client &
sleep 5
Запускается сервер, создает очередь, потом клиент запускается, кидает сообщение и закрывается. Сообщение пропадать в неблокирующем режиме не должно, ожидаю так. Затем сервер работает еще несколько секунд и осуществляет попытки чтения. Но ничего нет.
Под QNX4 хотя бы очереди открываются, а под Linux нет. Что-то надо запустить? Или модуль ядра запустить?