2010年(49)
分类: 嵌入式
2010-09-07 13:56:38
1 标准输入输出设备
在vxWorks中,当打开设备时,会返回文件描述符,即设备将会以文件的形式来提供给用户操作。文件描述符就是一个int类型的整数,但是打开设备时返回的文件描述符的值总是大于2。这是因为0,1,2被vxWorks系统保留为STD_IN,STD_OUT,STD_ERR即标准输入、标准输出及标准错误输出设备。实际上标准输入输出设备的存在很让人迷惑。标准输入输出设备应该理解为逻辑上存在的设备,它不是具体的设备,但是它可以指向任何设备。每个任务,都有自己逻辑上的标准输入输出设备,任务的输出和输入动作都是和标准输入输出这些逻辑设备打交道。 而标准输入输出设备如何指向实际的设备就是IO重定向来完成的。
2 IO重定向
IO重定向的本质是什么?就是给系统或单个任务确定其标准输入输出设备指向的真正设备,就是把标准输入输出设备定向的到用户希望的设备上。在未做IO重定向之前,任务的标准输入输出设备指向的设备文件描述符就是自身,而自身0、1、2是不存在的设备,所以任务无法获得输入并且输出也是无效的。
以vxWorks为例,它提供的IO重定向功能有两种,全局IO重定向和任务IO重定向。全局IO重定向是对任务IO重定向的有效补充。主要就是当一个任务没有进行有效的IO重定向时,它将使用全局标准输入输出设备。下面使用例子详细说明全局IO重定向。
假设seiralFd是一个串行设备打开后返回的文件描述符,并且它的值是3。
(1) 在未做IO重定向之前,使用printf和get函数都是没有效果的
(2) 使用ioGlobalStdSet(STD_IN, seiralFd)类似的用法来把全局标准输入输出定向到我们的串口seiralFd,这样printf和get就会从串口设备输出和获取内容。
(3) 但是用printf和get还不足以说明的IO重定向的精要。我们来使用write和read这两个标准函数。Write和read共同的特点是需要指定输出或输入设备。以write为例,其原型为
int write
(
int fd, /* file descriptor on which to write */
char * buffer, /* buffer containing bytes to be written */
size_t nbytes /* number of bytes to write */
)
用户可以这么写write(STD_OUT,”hello”,6);
此时,STD_OUT的实际值是1,但是这句将会向seiralFd即文件描述符3输出hello这个字符串。