17.2 ioctl Function This function affects an open file referenced by the fd argument. #include <unistd.h> | int ioctl(int fd , int request , ... /* void * arg */ ); | Returns:0 if OK, -1 on error | The third argument is always a pointer, but the type of pointer depends on the request . 4.4BSD defines the second argument to be an unsigned long instead of an int , but that is not a problem since header files define the constants that are used for this argument. As long as the prototype is in scope (i.e., the program using ioctl has included <unistd.h> ), the correct type for the system will be used. Some implementations specify the third argument as a void * pointer instead of the ANSI C ellipsis notation. There is no standard for the header to include to define the function prototype for ioctl since it is not standardized by POSIX. Many systems define it in <unistd.h> , as we show, but traditional BSD systems define it in <sys/ioctl.h> . We can divide the requests related to networking into six categories: Recall from Figure 7.20 that not only do some of the ioctl operations overlap some of the fcntl operations (e.g., setting a socket to nonblocking), but there are also some operations that can be specified more than one way using ioctl (e.g., setting the process group ownership of a socket). Figure 17.1 lists the requests , along with the datatype of what the arg address must point to. The following sections describe these requests in more detail. Figure 17.1. Summary of networking ioctl requests. |