[Chapter 3] 3.2.77 ioctl
Author: Larry Wall, Tom Christiansen & Randal L. Schwartz
Date: 1999-07-02T01:50:46Z

#

| Chapter 3 Functions |

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

3.2.76 int |  | 3.2.78 join