第十周学习报告

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后,键盘键入命令是不可见的,两者结合起来用

 

 

posted on 2015-11-15 10:18  20135314朱恒志  阅读(247)  评论(1编辑  收藏  举报