C程序设计语言第八章 UNIX系统接口

第八章 UNIX系统接口

文件描述符

  • 在UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件,因此,所有的输入/输出都要通过读文件或写文件完成。也就是说,通过一个单一的接口就可以处理外围设备和程序之间的所有通信。

  • 打开文件

  • 使用 prog <输入文件名>输出文件名 重定向IO

    • 当命令解释程序( 即" shell") 运行一一个程序的时候,它将打开3个文件,对应的文件描述符分别为0,1, 2,依次表示标准输入,标准输出和标准错误。如果程序从文件0中读,对1和2进行写,就可以进行输/输出而不必关心打开文件的问题。
    • 在任何情况下,文件赋值的改变都不是由程序完成的,而是由shell完成的。只要程序使用文件0作为输入,文件1和2作为输出,它就不会知道程序的输入从哪里来,并输出到哪里去。

低级IO read\write

  • int n_read = read(int fd, char *buf, int n);
    int n_written = write(int fd, char *buf, int n);
    第一个参数是文件描述符,第二个参数是程序中存放读或写的数据的字符数组,第三个参数是要传输的字节数。

    • 每个调用返回实际传输的字节数。在读文件时,函数的返回值可能会小于请求的字节数。如果返回值为0,则表示已到达文件的结尾;如果返回值为-1,则表示发生了某种错误。在写文件时,返回值是实际写入的字节数。如果返回值与请求写入的字节数不相等,则说明发生了错误。
    • 在一次调用中,读出或写入的数据的字节数可以为任意大小。最常用的值为1,即每次读出或写入1个字符(无缓冲),或是类似于1024~4096这样的与外围设备的物理块大小相应的值。用更大的值调用该函数可以获得更高的效率,因为系统调用的次数减少了。

open、create、close、unlink

  • int open(char *name, int flags, int perms);

    • name 文件名
      flags 以何种方式打开文件
      perms
    • 返回一个int类型的数值,如果发生错误返回-1
    • O_RDONLY 以只读方式打开文件
      O_WRONLY 以只写方式打开文件
      O_RDWR 以读写方式打开文件
  • int creat(char *name, int perms);

    • name 文件名
      perms 指定文件权限
    • 创建新文件或者覆盖已有文件
    • 如果creat成功地创建了文件,它将返回一个文件描述符,否则返回-1。如果此文件已存在,create将把该文件的长度截断为0,从而丢弃原先已有的内容。使用creat创建一一个已存在的文件不会导致错误。
  • close(int fd)

    • 函数close (int fd)用来断开文件描述符和已打开文件之间的连接,并释放此文件描述符,以供其它文件使用。close函数与标准库中的fclose函数相对应,但它不需要清洗( flush)缓冲区。如果程序通过exit函数退出或从主程序中返回,所有打开的文件将被关闭。
  • unlink(char *name)

    • 将文件name从文件系统中删除,应对于标准库函数remove

随机访问 long lseek(int fd, long offset, int origin);

  • fd 文件
    offset 相对文件当前位置的位置,相当于数值的index
    origin 0、1、2 分别从文件头、文件当前位置、文件尾
  • 使用lseek系统调用时,可以将文件视为一个大数组,其代价是访问速度会慢一些

C程序设计语言第八章 UNIX系统接口