ioctlFILEHANDLE
,FUNCTION
,SCALAR
This function implements the ioctl(2) system call. You'll probably have to say:
require "ioctl.ph"; # probably /usr/local/lib/perl/ioctl.ph
first to get the correct function definitions. If ioctl.ph
doesn't exist or doesn't have the correct definitions you'll have to
roll your own, based on your C header files such as
<sys/ioctl.h>. (The Perl distribution includes a script called
h2ph to help you do this, but it's non-trivial.)
SCALAR
will be read and/or written depending on the FUNCTION
- a
pointer to the string value of SCALAR
will be passed as the third
argument of the actual ioctl(2) call. (If SCALAR
has no string value but
does have a numeric value, that value will be passed directly rather
than a pointer to the string value.) The pack and
unpack functions are useful for manipulating the values of
structures used by ioctl.
The following example sets the erase character to DEL on many UNIX systems
(see the POSIX module in Chapter 7 for a slightly more portable interface):
require 'ioctl.ph'; $getp = &TIOCGETP or die "NO TIOCGETP"; $sgttyb_t = "ccccs"; # 4 chars and a short if (ioctl STDIN, $getp, $sgttyb) { @ary = unpack $sgttyb_t, $sgttyb; $ary[2] = 127; $sgttyb = pack $sgttyb_t, @ary; ioctl STDIN, &TIOCSETP, $sgttyb or die "Can't ioctl TIOCSETP: $!"; }
The return value of ioctl (and fcntl) is as follows:
System call returns | Perl returns |
---|---|
-1 | undefined value |
0 | string "0 but true " |
anything else | that number |
Thus Perl returns true on success and false on failure, yet you can still easily determine the actual value returned by the operating system:
$retval = ioctl(...) or $retval = -1; printf "System returned %d\n", $retval;
Calls to ioctl should not be considered portable. If, say, you're merely turning off echo once for the whole script, it's much more portable (and not much slower) to say:
system "stty -echo"; # Works on most UNIX boxen.
Just because you can do something in Perl doesn't mean you ought to. To quote the Apostle Paul, "Everything is permissible - but not everything is beneficial."