ioctl(2)
関数をインプリメントする。正しく関数を定義するにはおそらく
require "ioctl.ph"; # probably /usr/local/lib/perl/ioctl.ph
を最初に行う必要があるだろう。
`ioctl.ph' がなかったり正しく定義されていなければ、
`<sys/ioctl.h>' などに基づいて自分で定義する必要がある。
(perl キットには、
この作業を助けるための h2ph
という perl スクリプトがある。)
SCALAR
は FUNCTION
により、
参照かつまたは代入される -- SCALAR
の文字列値へのポインタが
実際の ioctl
コールの三番目の引数として渡される。
(SCALAR
が文字列値でなくて数値の場合は、
文字列値へのポインタではなくその値が渡される。
これを常に保証するには、SCALAR
にあらかじめ 0 を足せば良い。)
ioctl()
で使用される構造体の値を操作するには、
pack()
や unpack()
関数が便利である。
次の例では、erase character を DEL
にセットする。
do 'ioctl.ph';
$sgttyb_t = "ccccs"; # char 4 つと short
if (ioctl(STDIN,$TIOCGETP,$sgttyb)) {
@ary = unpack($sgttyb_t,$sgttyb);
$ary[2] = 127;
$sgttyb = pack($sgttyb_t,@ary);
ioctl(STDIN,$TIOCSETP,$sgttyb)
|| die "Can't ioctl: $!";
}
ioctl
(および fcntl
)の返り値は次のようになる。
OS の返り値: perl の返り値
-1 undefined value
0 string `0 but true'
それ以外 その値
つまり、perl は成功すれば真、失敗すれば偽を返すが、
OS が返す実際の値を簡単に得ることもできる。
($retval = ioctl(...)) || ($retval = -1);
printf "System returned %d\n", $retval;