start page | rating of books | rating of authors | reviews | copyrights

Programming Perl

Programming PerlSearch this book
Previous: 3.2.76 int Chapter 3
Functions
Next: 3.2.78 join
 

3.2.77 ioctl

ioctl 

FILEHANDLE

, 

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


Previous: 3.2.76 int Programming Perl Next: 3.2.78 join
3.2.76 int Book Index 3.2.78 join