int ioctl(int d, int request, ...); 后续是否有参数根据第二个参数request的需要来决定。
ioctl用于硬件设备I/O通道控制,控制命令与参数都与设备高度相关,通常也与系统高度相关。
操作控制的对象是: 文件描述符。
ioctl()是底层的系统调用(system call),所以跨平台特性不好。
而fcntl则是被封装的函数,各个OS都是支持的。
在网络socket中,他们作用大概相似。
例如都可以设置socket的是否允许非阻塞模式,不过设置方式上略有不同:
int socketfd = .....;
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 structlinger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 structtimeval
SO_SNDTIMEO 发送超时 structtimeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
setsockopt()只是针对socket设置参数,是在连接中的参数控制,在OS层级的控制则由ioctl和fcntl控制。如果要是获取socket参数则使用getsockopt.