文件描述符编程
一般是一个小的非负整数,也就是说0,1等函数
标准输入,标准输出和标准错误spa
standard input,standard output,standard error,在不作特殊处理的状况下,3个描述符都连接到终端,也就是说,咱们用终端输入,输出和输出错误,使用 < >符号来重定向输入源和输出目的。
code
不带缓冲的I/O接口
函数open,read,write,lseek以及close提供了不带缓冲的I/O,这些函数都使用文件描述符。get
#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); }
以上是一个复制文件的程序实例。input
重点代码(4.1仅笔者本身理解,不做为读者参考):
原型
4.1 it
n=read(STDIN_FILENO,buf,BUFFSIZE)
STDIN_FILENO:是一个常量,POSIX标准的一部分,在unistd.h中定义,实际值为0,表示从输入源中读取最大为BUFFSIZE长度的内容到buf中,n表示读入数据的长度,若是n大于0,则写入到标准输出:io
write(STDOUT_FILENO,buf,n)
STDOUT_FILENO跟STDIN_FILENO同样都是一个常量,实际值为1,如无重定向,则从buf中写入n个字符到标准输出,返回值若是不等于n则输出错误。
输入ctrl+d结束输入。
4.2 重定向输入源和输出目的。
./a.out <infile>outfile
将infile中的内容读入,并写入到outfile,实现文件复制。
4.3 使用标准I/O
标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口,标准io头文件 stdio.h(忍不住吐槽下,虽然是高级编程,可是开篇例程并未引入标准io,后面再逐渐说起并且说的比较明白,比谭浩强的书更易懂一些。)
fgets:读取一行
getc:读取一个字符,getc(stdin);
putc:输出一个字符到标准输出,putc(c,stdout):输出c到标准输出
#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); }
使用标准io的代码跟不带缓冲的io比起来,参数比较少,写明的stdin和stdout也更容易阅读。
一点我的思考,c代码中常常见到在while,if等条件中执行语句的书写方式,一般表示默认执行,若是知足/不知足条件再执行后面的语句,与c入门时的思惟方式或者其余语言例程差异比较大,需得适应这种代码书写方式,要用好这种书写方式应该要多熟悉标准库函数原型,可以更好的利用函数的返回值做为判断条件,减小变量的定义,使代码更加整洁。