open/read/write/close等文件相关的系统接口

一、open/read/write/close

open
函数原型:

int open(const char* pathname, int flags); //open
int open(const char* pathname, int flags, mode_t mode); //create
  • 作文件打开函数时
    参数:
    pathname: 要打开的文件名
    flags: 打开方式(O_RDONLT只读\O_WRONLY只写\O_RDWR读写)
    返回值:失败 -1 成功:文件描述符

  • 作文件创建函数时
    参数:
    pathname: 要创建的文件名
    flags: 创建的文件方式(需要加上O_CREAT)
    mode: 创建的文件权限(如0644)

read
函数原型

size_t read(int fd, void* buf, size_t count);

作用:从fd文件中读取数据到buf所指向的空间,该空间大小为conut

参数:fd文件描述符,buf一块内存空间,count请求读取的字节数。
读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0。

write
函数原型

size_t write(int fd, const void *buf, size_t count);

作用:往fd所指向的文件中写入数据,数据的起始地址为buf,大小为len

参数:fd文件描述符;buf写入的数据保存在这个缓冲区里,同时文件当前的读写为止后移;count写入的字节数
返回值:成功返回写入的字节数,出错返回-1并设置errno写常规文件时,write的返回值通常等于请求写的字节数count,而向终端或者网络写则不一定。

close
函数原型

int close(int fd);

作用:关闭一个打开的文件
参数:fd 文件描述符
返回值:成功返回0,出错返回-1.

二、对比fd与FILE结构体

-文件描述符fd

概念:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

文件描述符类型:
习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。
0,1,2对应的物理设备一一般是:键盘,显示器,显示器。

查看当前最大打开的文件描述符:

ulimit -n
  • FILE结构体
struct FILE
{
    char *_ptr;//文件输入的下一个位置
    int _cnt;//当前缓冲区的相对位置
    char *_base;//指基础位置(文件的起始位置)
    int _flag;//文件标志
    int _file;//文件的有效性验证
    int _charbuf;//检查缓冲区状况,如果缓冲区则不读取
    int _bufsiz;//文件的大小
    char *_tmpfname;//临时文件名
};
  • (FILE*)文件指针
    文件指针指向进程用户区中一个被叫做FILE结构的结构数据。
    FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引;
    因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

  • fd和FILE的区别
    (1)文件描述符fd只是一个非负整数,在open时产生,起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针file。
    (2)open函数成功返回的是文件描述符fd,内核会在每个进程空间中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用
    (3)fopen函数返回的是一个文件指针(FILE*),FILE结构是包含有文件描述符的,fopen可以看做是open(fd直接操作的系统调用)的封装,它的优点是带有I/O缓存。

猜你喜欢

转载自blog.csdn.net/wandandi/article/details/81051527