
我这样做的方式是:
mysocket=socket(....)
ioctl(mysocket, FIONBIO, &zero)
connect(.....)
ioctl( mysocket, FIONREAD, &numBytes )
read(mysocket, buffer, numBytes)
这在unix中工作正常,现在我必须将它移植到linux我一直得到ERROR
错误:未在此范围内声明'FIONBIO'
是否有一些特定于Linux的头文件?或者'FIOBIO'在linux中根本不起作用?
我有以下标题包括:
#include <cstring>
#include <sys/socket.h>
#include <stropts.h>
#include <fcntl.h>
#include <stddef.h>
#include <sys/un.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <fstream>
我删除了
#include <sys/filio.h>
因为它抛出了错误,说没有找到sys/filio.h
mfo*_*ini 18
你试过包含sys/ioctl.h吗?
这段代码适合我:
#include <sys/ioctl.h>
#include <stdio.h>
int main() {
printf("FIONBIO value %d\n", FIONBIO)
}
当我执行时grep -R FIONBIO /usr/include,它在这里找到:
/usr/include/asm-generic/ioctls.h:#define FIONBIO 0x5421
ioctl是iocontrol的缩写,就是IO控制。行为上:
简单来说,如果你在写驱动程序时候,碰到一些IO *** 作,在逻辑上不能归类到read,不能归类到write,那就可以认为是ioctl的部分。
read和write应该是写入和读出数据的,应该是作为单纯的数据交换的方式来处理。而ioctl则是控制read和write一些选项的。比如:你做了一个通用的读写IO端口的驱动模块。read和write是从端口读写数据的,但是更改读写的端口,这个 *** 作应该如何处理呢?显然用ioctl来实现比较合理。比如你的read和write是可以阻塞的,或者不能阻塞的,或者对设备文件的读写是可以并发的,或者是不可以并发的,这些都可以写成可以用ioctl来配置的情况。后面为了可以用ioctl来实现模块不同的IO特点。
参数上,ioctl的一般参数格式就是命令字(常量)+命令参数的方式。
read和write的参数格式都是数据缓冲区+数据目的地指针+长度。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)