Go to the first, previous, next, last section, table of contents.

ioctl

`ioctl(FILEHANDLE,FUNCTION,SCALAR)'
ioctl(2) 関数をインプリメントする。正しく関数を定義するにはおそらく
require "ioctl.ph";  # probably /usr/local/lib/perl/ioctl.ph
を最初に行う必要があるだろう。 `ioctl.ph' がなかったり正しく定義されていなければ、
`<sys/ioctl.h>' などに基づいて自分で定義する必要がある。 (perl キットには、 この作業を助けるための h2ph という perl スクリプトがある。) SCALARFUNCTION により、 参照かつまたは代入される -- 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;

Go to the first, previous, next, last section, table of contents.