1、文件描述符
  对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或create返回的文件描述符表示该文件,将其作为参数传给read或write函数。
  2、write函数
  write函数定义如下:
  #include < unistd >
  ssize_t write(int filedes, void *buf, size_t nbytes);
  // 返回:若成功则返回写入的字节数,若出错则返回-1
  // filedes:文件描述符
  // buf:待写入数据缓存区
  // nbytes:要写入的字节数
  
write函数简单示例代码:

#include <error.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
int main()
{
    int fd = open("./write.txt", O_WRONLY  | O_CREAT, 0666);
    if (-1 == fd){
        perror("open file error");
        return;
    }
    char* buff = "write data to file!";
    ssize_t writelen = write(fd, buff, strlen(buff));
    printf("%d ", writelen);
    close(fd);
    return 0;
}
  3、read函数
  read函数定义如下:
  #include < unistd >
  ssize_t read(int filedes, void *buf, size_t nbytes);
  // 返回:若成功则返回读到的字节数,若已到文件末尾则返回0,若出错则返回-1
  // filedes:文件描述符
  // buf:读取数据缓存区
  // nbytes:要读取的字节数
  有几种情况可使实际读到的字节数少于要求读的字节数:
  1)读普通文件时,在读到要求字节数之前已经达到了文件末端。例如,若在到达文件末端之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用read时,它将返回0(文件末端)。
  2)当从终端设备读时,通常一次多读一行。
  3)当从网络读时,网络中的缓存机构可能造成返回值小于所要求读的字结束。
  4)当从管道或FIFO读时,如若管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数。
  5)当从某些面向记录的设备(例如磁带)读时,一次多返回一个记录。
  6)当某一个信号造成中断,而已经读取了部分数据。
  
read函数简单示例代码:
#include <error.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
int main()
{
    int fd = open("./read.txt", O_RDONLY | O_CREAT, 0666);
    if (-1 == fd){
        perror("open file error");
        return;
    }
    char buff[1024];
    memset(buff, 0, sizeof(buff));
    ssize_t readlen = read(fd, buff, 1024);
    printf("%s", buff);
    printf("%d ", readlen);
    close(fd);
    return 0;
}