Re: posix message queues, was Re: 2.6.4-rc1-mm1

From: Krzysztof Benedyczak
Date: Mon Mar 01 2004 - 09:30:06 EST


bert hubert wrote:

On Sun, Feb 29, 2004 at 02:06:17PM -0800, Andrew Morton wrote:



- Added the POSIX message queue implementation. We're still stitching
together a decent description of all of this. Reference information is at
http://www.mat.uni.torun.pl/~wrona/posix_ipc/
and
http://www.opengroup.org/onlinepubs/007904975/basedefs/mqueue.h.html



I can confirm that basic functionality is there. Both blocking and
nonblocking operations work as advertised. Queue properly blocks when full
or empty.

mq_timedsend does not wait, it immediately returns ETIMEOUT with the queue
is full:

struct timespec ts;
ts.tv_sec=1;
ts.tv_nsec=0;
sprintf(msgptr,"%05d %s",c,stime);
if ( mq_timedsend(mqd,msgptr,msglen,msg_prio, &ts) )
{
perror("mq_send()");
break;
}

results in:

$ ./mqreceive /Q32x128
1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004 $ ./mqreceive /Q32x128
1: priority 0 len 64 text 00001 Mon Mar 1 12:20:11 2004 $ ./mqsend /Q32x128
$ ./mqsend /Q32x128
$ ./mqsend /Q32x128
mq_send(): Connection timed out <- immediately


It _should_ return immediately. mq_timedsend timeout must be given as absolute value, so if you want to have one second timeout from now,
you must do:

ts.tv_sec = time(NULL) + 1;
ts.tv_nsec = 0;

And I don't have idea why POSIX defines timeout as absolute not relative ;-).

I would very much advise Michal and Krzysztof to add some basic examples to
their page. I had to scour the internet to find some working code.


Thats right. The above problem also shows that such examples can be usefull. We are just now updating man pages for the library (there are some obsolete informations) and I will prepare some well commented programs.

Mounting the queuefs works but the fs, confusingly, is called mqueue and not
mqueuefs.


As proc or msdos. Of course it can be changed if more people will want 'fs' suffix. Menuconfig help gives proper name.

Regards,
Krzysiek

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/