实现 fcntl(2) 函数。你可能需要先说
use Fcntl;
来获取正确的常量定义。参数处理和返回值的工作方式与下面的 ioctl
相同。例如
use Fcntl;
my $flags = fcntl($filehandle, F_GETFL, 0)
or die "Can't fcntl F_GETFL: $!";
你不需要检查 defined
是否在 fcntl
的返回值上定义。与 ioctl
一样,它将系统调用返回的 0
映射到 Perl 中的 "0 但为真"
。此字符串在布尔上下文中为真,在数字上下文中为 0
。它也免受正常 Argument "..." isn't numeric
警告 的影响,这些警告会出现在不正确的数字转换中。
请注意,如果在没有实现 fcntl(2) 的机器上使用 fcntl
,它会引发异常。请参阅 Fcntl 模块或你的 fcntl(2) 手册页,了解你的系统上有哪些可用函数。
以下是如何将名为 $REMOTE
的文件句柄设置为在系统级别非阻塞的示例。不过,你必须自己协商 $|
。
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";
可移植性问题:"fcntl" in perlport.