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

Should I replace the following with a 'sysopen' function, like in the locking example ?

open(ORDERFILE, ">$outfile")

Peter

Replies are listed 'Best First'.
Re: Re: Re: Perl script crashing at lockfile ?
by peterr (Scribe) on Oct 02, 2003 at 05:46 UTC
    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

      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.