For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > March 2004 > Make a nice buffer?









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Make a nice buffer?
David Busby

2004-03-26, 11:14 pm

List,
I want to make a buffer for my application to write log data to. I've
created a fifo (`mkfifo /tmp/buf`) Then I made my PERL script that
reads from /tmp/buf. Other programs open and write to /tmp/buf but when
they close then my program that is reading from /tmp/buf stops. I want
the script that reads and buffers (then parses and other such stuff) not
to close when the other folks are done writing to the fifo at /tmp/buf.
Ideas? Should I just loop and re-open after every close (seems bad).

/djb

Gary Stainburn

2004-03-26, 11:15 pm

On Thursday 25 March 2004 10:30 pm, David Busby wrote:
> List,
> I want to make a buffer for my application to write log data to. I've
> created a fifo (`mkfifo /tmp/buf`) Then I made my PERL script that
> reads from /tmp/buf. Other programs open and write to /tmp/buf but when
> they close then my program that is reading from /tmp/buf stops. I want
> the script that reads and buffers (then parses and other such stuff) not
> to close when the other folks are done writing to the fifo at /tmp/buf.
> Ideas? Should I just loop and re-open after every close (seems bad).
>
> /djb


Hi David,

I think that's the normal for pipes. The way I understand it, a pipe is
simply a meeting point for someone openening a file for writing and one
opening a file for reading. If you open first, your open won't complete
until the other proces tries to open soon. Then their write open is directly
connected to your read open. This means that when they close, you're closed
too. As you can see from my code below, you have to re-open every time you
enter the loop.

Gary

#!/usr/bin/perl -w

my $VERSION='1.0.0';
# daemon to sit listening to a pipe and actioning print requests.
select(STDERR); $|=1;
select(STDOUT); $|=1;

my $inp;

chdir $ENV{RWDDATA} || die "cannot cd: $!\n";
die "pipe is missing\n" unless ( -p "rwfifo");

while (1) {
print "opening...";
open(FIN,"rwfifo") || die "cannot open pipe: $!";
print "Done\nreading pipe...";
$_=<FIN>;
chomp;
print "Done\n";
last if (/^quit/i);
next if (/loop/i);
print "executing rwlpr $_ loop .....";
print ((system "rwlpr $_ loop") ? "failed: $?\n" : "done\n");
print "reading pipe...";
}


--
Gary Stainburn

This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com