本文主要简单介绍Unix输入输出
文件描述符
文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件
标准输入、输出和标准错误
每当运行一个新程序的时候,所有的shell都为其打开3个文件描述符:标准输入、输出和标准错误
不带缓存的I/O
函数open、read、write、lseek、close提供了不带缓存的I/O,这些函数都使用文件描述符
举个例子:
复制任一Unix普通文件
#include"apue.h" #define BUFFSIZE 4096 int main(void) { int n; char buf[BUFFSIZE]; while((n = read(STDIN_FILENO, buf,BUFFSIZE)) > 0) if(write(STDOUT_FILENO, buf, n) != n) err_sys("write error"); if(n < 0) err_sys("read error"); exit(0); }
read函数返回读取的字节数,当到达输入文件的尾端时,read返回0,程序停止执行。如果发生一个读错误,返回-1
编译上面的程序:
./a.out > data
这种情况下复制的是从终端的输入到文件data,键入文件结束符Ctrl+D
若以下列方式执行
./a.out < infile > outfile
则是从infile复制到outfile
经过实践发现,每次目标文件都将重新清空后再复制
标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口
举个例子:
同样实现复制Unix任一文件的功能
#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); }
Comments