10.7 I/O重定向
Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来,例如:
unix > ls > foo.txt
dup2函数:
拷贝描述符表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。
10.8 标准I/O
标准I/O库(libc):高级输入输出函数
fopen/fclose:打开和关闭文件
fread/fwrite:读和写字节
fgets/fputs:读和写字符串
scanf/printf:复杂格式化的I/O函数
标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构指针。
每个程序开始时都有三个打开的流:
stdin:标准输入
stdout:标准输出
stderr:标准错误
类型为FILE的流是对文件描述符和流缓冲区的抽象,流缓冲区的目的:使开销较高的Unix I/O系统调用的数量尽可能的小。
10.9 综合:我该使用那些I/O函数
标准I/O流,全双工,so为了防止冲突:
- 限制一:跟在输出函数后的输入函数。——采用在每个输入操作前刷新缓冲区
- 限制二:跟在输入函数后的输出函数。——对同一个打开的套字描述符打开两个流,一读一写。
大多数情况使用标准I/O,但在网络套字上不要使用,这时使用健壮地RIO函数。
格式化输出
使用sprintf函数在存储器中格式化一个字符串,然后用rio_writen把它发送到套接口。
格式化输入
使用rio_readlineb来读一个完整的文本行,然后使用sscanf从文本行提取不同的字段。
附录A 错误处理
错误处理包装函数:
给定某个基本的系统级函数foo,定义一个有相同参数的包装函数Foo。包装函数调用基本函数并检查错误。如果发现错误就打印一条信息并终止进程,否则返回调用者。即如果没有错误,包装函数的行为与基本函数完全一样。
包装函数被封装在一个源文件(csapp.c)中,被编译和链接到每个程序中。
A.1 Unix系统中的错误处理
1、Unix风格的错误处理
函数返回值既包括错误代码又包括有用的结果。如果遇到错误就返回-1,并将全局变量errno设置为指明错误原因的错误代码。如果成功就返回有用的结果。
2、Posix风格的错误处理
只用返回值来表明成功(0)或者失败(非0)。任何有用的结果都返回在通过引用传递进来的函数参数中。
3、DNS风格的错误处理
在失败时返回NULL指针,并设置全局变量h_errno。
A.2 错误处理包装函数
-
Unix风格的错误处理包装函数
-
Posix风格的错误处理包装函数
-
DNS风格的错误处理包装函数
实践部分:
代码:
ls能干什么:
ls -l
ls -a
ls -lu:最后访问时间
ls -s:以块为单位的文件大小
ls -t:按时间排序
ls -F:显示文件类型
ls1:
显示当前文件夹的内容
ls2:
功能和ls1一样,并打印权限大小时间...
who:
who也有两个代码,运行的结果是一样的,代码实现的功能是一样的
主要是从UTMP_FILE文件中读取信息到存储器中,然后再用标准输出函数打印信息:name,line,time,host,然后关闭文件
cp:
cp命令用来复制文件或者目录
setecho:
是设置echo值的一个函数
echostate:
这个函数是用来检查键盘键入命令是否可见
由于setecho输入yes后,键盘键入命令是可见的,而输入no后,键盘键入命令是不可见的,两者结合起来用