首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.5 输入和输出

1. 文件描述符

文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。在读、写文件时,就可使用它。

2. 标准输入、标准输出和标准出错

按惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入(standard input)、标准输出(standard output)以及标准出错(standard error)。如果像简单命令ls那样没有做什么特殊处理,则这三个描述符都链向终端。大多数shell都提供一种方法,使其中任何一个或所有这三个描述符都能重新定向到某个文件,例如:

 

执行ls命令,其标准输出重新定向到名为file.list的文件上。

3. 不用缓冲的I/O

函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符。

实例

如果愿意从标准输入读,并写向标准输出,则程序清单1-2中的程序可用于复制任一UNIX 普通文件。

头文件<unistd.h>(apue.h中包含了此头文件)及两个常量STDIN_FILENO和STDOUT_FILENO是POSIX标准的一部分(下一章将对此作更多的说明)。该头文件包含了很多UNIX系统服务的函数原型,例如程序清单1-2中调用的read和write。

两个常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,它们指定了标准输入和标准输出的文件描述符。它们的典型值分别是0和1,但是考虑到可移植性,我们将使用新名字。

3.9节将详细讨论BUFFSIZE常量,说明它的各种不同值将如何影响程序的效率。但是不管该常量的值如何,此程序总能复制任一UNIX普通文件。read函数返回读得的字节数,此值用作要写的字节数。当到达文件的尾端时,read返回0,

程序停止执行。如果发生了一个读错误,read返回-1。出错时大多数系统函数返回-1。如果编译该程序,其结果送入标准的a.out文件,并以下列方式执行它:

那么,标准输入是终端,标准输出则重新定向至文件data,标准出错也是终端。如果此输出文件并不存在,则shell会创建它。该程序将用户键入的各行复制至标准输出,键入文件结束字符(通常是Ctrl+D)时,则终止该次复制。

若以下列方式执行该程序:

那么名为infile文件的内容复制到名为outfile的文件中。□第3章将更详细地说明不用缓冲的I/O函数。

4. 标准I/O

标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口。使用标准I/O函数可以无需担心如何选取最佳的缓冲区大小,例如程序清单1-2中的BUFFSIZE常量的大小。使用标准I/O函数的另一个优点是简化了对输入行的处理(常常发生在UNIX的应用中)。例如,fgets函数读一完整的行,而read函数读指定字节数。在5.4节中我们将了解到,标准I/O函数库提供了使我们能够控制该库所使用的缓冲风格的函数。

我们最熟悉的标准I/O函数是printf。在调用printf的程序中,总是包括<stdio.h> (在本书中,该头文件通常包括在apue.h中),该头文件包括了所有标准I/O函数的原型。

实例

程序清单1-3的功能类似于调用read和write的前一个程序,5.8节将对此程序作更详细的说明。它将标准输入复制到标准输出,于是也就能复制任一UNIX普通文件。

 

函数getc一次读1个字符,然后函数putc将此字符写到标准输出。读到输入的最后1个字节时,getc返回常量EOF,该常量在<stdio.h>中定义。标准输入/输出常量stdin和stdout也定义在头文件<stdio.h>中,它们分别表示标准输入和标准输出文件。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论