1. Linux系统调用及用户编程接口(API)

    1.1 系统调用

      所谓的系统调用时指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服

      务。例如用户可以通过进

      程控制相关的系统调用来创建进程,实现进程的调度,进程管理等。

      程序的运行空间分为内核空间和用户空间,由于它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不

      允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。

    1.2 用户编程接口(API)

      由于系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。在实际使用中程

      序员调用的通常是用户编程接口--API,也就是API函数。但并不是所有的函数都一一对应一个系统调用,有时,一个API函数会需要几个

      系统调用共同完成函数的功能,甚至还有一些API函数会需要几个系统调用(因此它所完成的不是内核提供的服务)。这些系统调用编程接

      口主要是通过C库(libc)实现的。

    1.3 系统命令

      系统命令相对于API更高一层,它实际上是一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。它们关系图如下:

      

      

  2 Linux中文件及文件描述符概述

      Linux中文件主要分为4种: 普通文件,目录文件,链接文件和设备文件。

      文件描述符:

            对于Linux而言,所有对设备和文件的操作都是使用文件描述符来进行的。文件描述符是一个非负整数,它是一个索引值,并

            指向在内核中每个进程打开文件的记录表。当打开一个现存文件或者创建一个新文件时,内核就向进程返回一个文件描述

            符:当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数

      通常,一个进程启动时,都会打开3个文件: 标准输入,标准输出和标准出错处理。这3个文件分别对应文件描述符为0、1 和 2(也就是

      宏替换STDIN_FILENO, STDOUT_FILENO 和 STDERR_FILENO)

  3. 底层文件I/O操作

    3.1 基本文件操作

      (1)函数说明:

          open()函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。

          close()函数是用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功

              能而不显示地关闭一个文件。

          read()函数是用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数。若返回0,则表示没有数据可

              读,即已达到文件尾。读操作从文件的当前指针位置开始。当从终端设备文件中读出数据时,通常一次最多读一行。

          write()函数是用于向打开的文件写数据,写操作从文件的当前指针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件
 
              的长度,则write()函数返回失败。

          lseek()函数是用于在指定的文件描述符中将文件指针定位到相应的位置。它只能用在可定位(可随机访问)文件操作中。管道、

              套接字和大部分字符设备文件是不可定位的,所以在这些文件的操作中无法使用lseek()调用。

       (2)格式说明:

          open()函数的格式

          

          在open()函数中,flag参数可通过“|”组合构成,但前3个标志常量(O_RDONLY(只读), O_WRONLY(只写) 和

           O_RDWR(读写))不能相互组合。perms是文件的存取权限,既可以用宏定义表示法,也可以用八进制表示法。

          close()函数的格式:

          

          read()函数的格式:

          

          read()函数中的ssize_t返回类型是被宏定义的,接下来的write()函数,lseek()函数也一样。

          write()函数的格式:

          

          lseek()函数的格式: