Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Apr 2004 23:00:22 -0700
From:      Lev Walkin <vlm@netli.com>
To:        dudu@diaspar.rdsnet.ro
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: SYSV message queues
Message-ID:  <407A3076.8030005@netli.com>
In-Reply-To: <20040412011216.P7661@qvnfcne.eqfarg.eb>
References:  <20040412011216.P7661@qvnfcne.eqfarg.eb>

next in thread | previous in thread | raw e-mail | index | archive | help
Vlad GALU wrote:
> 	Hello. I have the following scenario: one process that creates a
> message queue and goes through it in a loop, together with another process
> that inserts various messages into the queue. What I wish is for the
> 'listening' process to be able to fully process the queue at a fixed
> amount of time. In short, I'd like msgrcv() to iterate throught the queue
> and visit every element in a single run. That set of operations being done
> periodically.
> 	Do you find this possible ? I'm quite puzzled here. I first tried
> inserting a sleep() call in my queue processing loop but then I noticed
> that it had a bad effect. It's true that I haven't read the man page very
> carefully the first time. I'll blame it on the hurry.
> 
> 	However, while writing this message, an idea occured to me. What
> if I write the processing loop as follows:
> 
> 	-- cut here --
> 	int i;
> 	while (1) {
> 		i = 0;
> 		msgctl(queueid, IPC_STAT, &queuestat);
> 		while (i <= queuestat.msg_qnum) {
> 			msgrcv(queueid, &message, sizeof(message), 0, 0);
> 			process_message(message);
> 			i++;
> 		}
> 		sleep(5);
> 	}
> 	-- and here --
> 
> 	Does this look pheasible ? I'm expecting an injection of about
> 100k messages per second or even more. There'll be quite a lot of
> unprocessed ones at the end of each run, I suppose. I'll measure the average time spent for
> one run and decide on the sleep interval.


Did you try to grok what the msgrcv() call is supposed to return?
Specifically, read about -1/EAGAIN and IPC_NOWAIT. Then remove sleep().

 > However, does anyone have a better design ?

Yes. Use sockets.

Obsolescent Unix IPC Methods
http://www.catb.org/~esr/writings/taoup/html/ch07s03.html#id2923376

-- 
Lev Walkin
vlm@netli.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?407A3076.8030005>