ioctl函数介绍:控制I/O设备及网络相关操作与参数说明
函数名: ioctl
头文件:#
功 能: 控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用read / write 读写的,称为Out-of-band数据。也就是说,read / write 读写的数据是in-band数据,是I/O操作的主体,而ioctl 命令传送的是控制信息,其中的数据是辅助的数据。
用 法: int ioctl(int , int cmd,
int *argdx, int argcx
);
返回值:成功为0,出错为-1
下表列出了网络相关ioctl请求的 参数以及arg 地址必须指向的数据类型:
套接口操作:
明确用于套接口操作的ioctl请求有三个, 它们都要求ioctl的第三个参数是指向某个整数的一个指针。
: 如果本套接口的的度指针当前位于带外标记,那就通过由第三个参数指向的整数返回一个非0 值;否则返回一个0 值。POSIX 以函数 替换本请求。
: 通过第三个参数指向的整数返回本套接口的进程ID 或进程组ID ,该ID 指定针对本套接口的SIGIO 或 信号的接收进程。本请求和fcntl 的 命令等效,POSIX 标准化的是fcntl 函数。
: 把本套接口的进程ID 或者进程组ID 设置成第三个参数指向的整数,该ID 指定针对本套接口的SIGIO 或 信号的接收进程,本请求和fcntl 的 命令等效,POSIX 标准化的是fcntl 操作。
文件操作:
以下5 个请求都要求ioctl的第三个参数指向一个整数。
: 根据ioctl的第三个参数指向一个0 或非0 值分别清除或设置本套接口的非阻塞标志。本请求和 文件状态标志等效,而该标志通过fcntl 的 命令清除或设置。
: 根据iocl 的第三个参数指向一个0 值或非0 值分别清除或设置针对本套接口的信号驱动异步I/O 标志,它决定是否收取针对本套接口的异步I/O 信号(SIGIO )。本请求和 文件状态标志等效,而该标志可以通过fcntl 的 命令清除或设置。
: 通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端。
: 对于套接口和 等效。
: 对于套接口和 等效。
接口配置:
得到系统中所有接口由请求完成,该请求使用结构,又使用ifreq
结构,如下所示:
{
int ; // 缓冲区的大小
union{
; // input from user->
ifreq *; // of
};
};
# . //
# . //array of
# 16
ifreq{

char ; // name, e.g., “le0”
union{
short ;
int ;
};
};
# . //
# . // otner end of p-to-p link
# . //
# . // flags
# . //
# . // for use by
再调用ioctl前我们必须先分撇一个缓冲区和一个结构,然后才初始化后者。如下图展示了一个结构的初始化结构,其中缓冲区的大小为1024,ioctl的第三个参数指向
这样一个结构。
假设内核返回2个ifreq结构,ioctl返回时通过同一个结构缓冲区填入了那2个ifreq结构,结构的成员也被更新,以反映存放在缓冲区中的信息量。
接口操作:
请求为每个已配置的接口返回其名字以及一个套接口地址结构。我们接着可以发出多个接口类其他请求以设置或获取每个接口的其他特征。这些请求的获取(get)版本()通常由程序发出,设置(set)版本()通常由程序发出。任何用户都可以获取接口信息,设置接口信息却要求有超级用户权限。
这些请求汲取或返回一个一个ifreq结构中的信息,而这个结构的地址则作为ioctl调用的第三个参数制定。接口总是以其名标志,在ifreq结构的成员中指定,如le0,lo0,ppp0等。
























