=over

=item fcntl FILEHANDLE,FUNCTION,SCALAR
X<fcntl>

Implements the L<fcntl(2)> function.  You'll probably have to say

    use Fcntl;

first to get the correct constant definitions.  Argument processing and
value returned work just like L<C<ioctl>|/ioctl
FILEHANDLE,FUNCTION,SCALAR> below.  For example:

    use Fcntl;
    my $flags = fcntl($filehandle, F_GETFL, 0)
        or die "Can't fcntl F_GETFL: $!";

You don't have to check for L<C<defined>|/defined EXPR> on the return
from L<C<fcntl>|/fcntl FILEHANDLE,FUNCTION,SCALAR>.  Like
L<C<ioctl>|/ioctl FILEHANDLE,FUNCTION,SCALAR>, it maps a C<0> return
from the system call into C<"0 but true"> in Perl.  This string is true
in boolean context and C<0> in numeric context.  It is also exempt from
the normal
L<C<Argument "..." isn't numeric>|perldiag/Argument "%s" isn't numeric%s>
L<warnings> on improper numeric conversions.

Note that L<C<fcntl>|/fcntl FILEHANDLE,FUNCTION,SCALAR> raises an
exception if used on a machine that doesn't implement L<fcntl(2)>.  See
the L<Fcntl> module or your L<fcntl(2)> manpage to learn what functions
are available on your system.

Here's an example of setting a filehandle named C<$REMOTE> to be
non-blocking at the system level.  You'll have to negotiate
L<C<$E<verbar>>|perlvar/$E<verbar>> on your own, though.

    use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);

    my $flags = fcntl($REMOTE, F_GETFL, 0)
        or die "Can't get flags for the socket: $!\n";

    fcntl($REMOTE, F_SETFL, $flags | O_NONBLOCK)
        or die "Can't set flags for the socket: $!\n";

Portability issues: L<perlport/fcntl>.

=back