in reply to Re: Re: Perl script crashing at lockfile ?
in thread Perl script crashing at lockfile ?

Hi,

Well, that worked, it has now actually created the ascii order file, and gone much further. Now it is stopping/doing nothing here

open(SENDMAIL, '|/usr/sbin/sendmail -oi -t') or (unlink ($outfile), diehtml("Can't fork for sendmail: $!\n"));
So, .... it looks like the moral to this story is replace ALL open() with sysopen(), using the parameters and examples as supplied, to fix the locking example.

If I used this code as a template for all the file opens

my $got_lock; use Fcntl; # to get constants for O_CREAT | O_EXCL | O_RDWR for ( 0 .. 5 ) { if ( sysopen(my $fh, "$base_dir/.lock", O_CREAT | O_EXCL | O_RDWR, + 0600) ) { $got_lock = 1; close $fh; last; } sleep 2; } diehtml("Lock error $!\n") unless $got_lock;
.... would I need the 'sleep', and what does the FOR contruct do ? Does it try for 6 times ?? Please pardon my ignorance, I'm _very_ much a novice at Perl. :)

Thanks,

Peter

Replies are listed 'Best First'.
Re: Re: Re: Re: Perl script crashing at lockfile ?
by peterr (Scribe) on Oct 02, 2003 at 10:34 UTC
    Interestingly, I use the "NMS" FormMail.pl, which runs SENDMAIL from the same website, and there is not a problem. I see "NMS" uses a pipe

    sub newmail { my ($self, $scriptname, $postmaster, @recipients) = @_; my $command = $self->{Mailprog}; $command .= qq{ -f "$postmaster"} if $postmaster; my $pipe; eval { local $SIG{__DIE__}; $pipe = IO::File->new("| $command"); }; if ($@) { die $@ unless $@ =~ /Insecure directory/; delete $ENV{PATH}; $pipe = IO::File->new("| $command"); } die "Can't open mailprog [$command]\n" unless $pipe; $self->{Pipe} = $pipe; $self->output_trace_headers($scriptname); }
    At line 430 in the version of FormMail.pl I have

    use IO::File;
    .. is IO::File part of the NMS libraries, or a standard Perl one ? (I have no idea if they are called libraries)

    Peter

      They're called "modules". And, yes, IO::File has been part of the standard distribution from at least Perl 5.6.x onwards. I'm not sure if it was in the Perl 5.00x distributions, but it's easily downloadable and installable from CPAN.

      ------
      We are the carpenters and bricklayers of the Information Age.

      The idea is a little like C++ templates, except not quite so brain-meltingly complicated. -- TheDamian, Exegesis 6

      Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.