fcntl - Perldoc Browser (original) (raw)
Implements the 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 ioctl below. For example:
use Fcntl;
my <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>l</mi><mi>a</mi><mi>g</mi><mi>s</mi><mo>=</mo><mi>f</mi><mi>c</mi><mi>n</mi><mi>t</mi><mi>l</mi><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">flags = fcntl(</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">c</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mopen">(</span></span></span></span>filehandle, F_GETFL, 0)
or die "Can't fcntl F_GETFL: $!";
You don't have to check for defined on the return from fcntl. Like ioctl, it maps a 0
return from the system call into "0 but true"
in Perl. This string is true in boolean context and 0
in numeric context. It is also exempt from the normal Argument "..." isn't numeric warnings on improper numeric conversions.
Note that fcntl raises an exception if used on a machine that doesn't implement fcntl(2). See the Fcntl module or your fcntl(2) manpage to learn what functions are available on your system.
Here's an example of setting a filehandle named $REMOTE
to be non-blocking at the system level. You'll have to negotiate $| on your own, though.
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
my <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>l</mi><mi>a</mi><mi>g</mi><mi>s</mi><mo>=</mo><mi>f</mi><mi>c</mi><mi>n</mi><mi>t</mi><mi>l</mi><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">flags = fcntl(</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">c</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mopen">(</span></span></span></span>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: "fcntl" in perlport.