ioctl FILEHANDLE,FUNCTION,SCALAR

实现 ioctl(2) 函数。你可能首先需要说

require "sys/ioctl.ph";  # probably in
                         # $Config{archlib}/sys/ioctl.ph

以获取正确的函数定义。如果 sys/ioctl.ph 不存在或没有正确的定义,你将不得不自己编写,基于你的 C 头文件,如 <sys/ioctl.h>。(Perl 工具包中有一个名为 h2ph 的 Perl 脚本,可能对你有帮助,但它不是微不足道的。)SCALAR 将根据 FUNCTION 被读取和/或写入;SCALAR 的字符串值的一个 C 指针将作为实际 ioctl 调用的第三个参数传递。(如果 SCALAR 没有字符串值,但有数值,则将传递该值,而不是指向字符串值的指针。为了确保这一点,在使用标量之前向标量添加一个 0。)可能需要 packunpack 函数来处理 ioctl 使用的结构的值。

ioctl(和 fcntl)的返回值如下

if OS returns:      then Perl returns:
    -1               undefined value
     0              string "0 but true"
anything else           that number

因此,Perl 在成功时返回 true,在失败时返回 false,但你仍然可以轻松地确定操作系统返回的实际值

my $retval = ioctl(...) || -1;
printf "System returned %d\n", $retval;

特殊字符串 "0 but true" 不受 Argument "..." isn't numeric 警告 中不正确的数字转换的影响。

可移植性问题:"ioctl" in perlport