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."