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 [EMAIL PROTECTED] _______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"