Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798064
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 13:01:32

ioctl函数总是包含了所有的I/O操作。任何不能用本章其它函数来表达的事情通常都需要ioctl来指定。终端I/O是这个函数的最大用户。(当我们到第18章时,我们将看到POSIX.1已经把终端I/O操作替换为单独的几个函数。)


#include /* System V */
#include /* BSD and LINUX */
#include /* XSI STREAMS */

int ioctl(int filedes, int request, ...);
错误返回-1,成功返回其它值。


ioctl函数被作为一个处理STREAMS设备[Rago 1993]的扩展包含在单一UNIX规范里。然而UNIX系统实现却使用它执行许多混杂的设备操作。一些实现还把它扩展为可以操作普通文件。


我们展示的函数原型对应着POSIX.1。FreeBSD 5.2.1和Mac OS X 10.3把第二个参数声明为unsigned long。这种细节无关紧要,因为第二个参数总是一个头文件里的一个#defined名。


根据ISO C原型,省略号被用来表示剩余的参数。尽管如此,通常只有一个多余的参数,而它一般是指向一个变量或结构体的指针。


在这个原型里,我们只展示包含函数本身的头文件。通常需要额外的设备相关的头文件。比如超越了POSIX.1规定的基本操作的处理终端I/O的ioctl命令,都需要头文件


每个设备驱动器可以定义它自己的ioctl命令集。尽管如此,系统为不用类型的设备提供了一个通用的ioctl命令。下表给出一FreeBSD支持的这些通用iotcl的一些类目的例子:

通用FreeBSD ioctl操作
类目 常量名 头文件 ioctl的数量
磁盘标签 DIOXXX 6
文件I/O FIOXXX 9
磁带I/O MTIOXXX 11
套接字I/O SIOXXX 60
终端I/O TIOXXX 444

磁带操作允许我们在磁带上写上文件结束标记,倒回磁带,前进越过特定数量的文件或记录,等等。这些操作中没有一个是能用本章其它函数(read、write、lseek等等)简单表达的,所以处理这些设备的最简单的方法一直是使用ioctl访问它们的操作。

我们在14.4节讨论STREAMS系统时、在18.12节得到和设置终端窗口的尺寸时、以及在19.7节访问伪终端的高级特性时会使用ioctl函数。
阅读(1150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~