文件描述符
文件描述符(file descriptor)通常是一个小的非负整数,内核用一个标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。标准输入、标准输出和标准错误
按惯例,每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。如果不做特殊处理,例如就像简单的命令ls,则3个描述符都链接向终端。大多数shell都提供一种方法,是其中任何一个或所有这3个描述符都能重新定向到某个文件。不带缓冲的I/O
函数open、read、write、lseek以及close提供了不带缓冲的I/O。这些函数都是用文件描述符。
#include <apue.h>
#define BUFFSIZE 4096
int main(void)
{
int c;
char buf[BUFFSIZE];
while((n==read(STDIN_FILENO,buf,BUFFSIZE))>0)
if(write(STDOUT_FILENO,buff,n)!=n)
err_sys("write error");
if(n<0)
err_sys("read error");
exit(0);
}
- 标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小,如BUFFSIZE常量的大小。使用标准I/O函数还简化了对输入行的处理(常常发生在UNIX的应用程序中)。例如,fgets函数读取一个完整的行,而read函数读取指定字节数。
最常见的函数便是printf。
#include <apue.h>
int main(void)
{
int c;
while((c=getc(stdin))!=EOF)
{
if(putc(c,stdout)==EOF)
{
err_sys("output error");
}
}
if(ferror(stdin))
err_sys("input error");
exit(0);
}