ioctr移植到linux

ioctr移植到linux,第1张

我想使用ioctl()来获取准备读取的字节数

我这样做的方式是:

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的参数格式都是数据缓冲区+数据目的地指针+长度。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11452191.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存