Loading

快乐Linux —— 8.2 系统调用IO

参考:

https://blog.csdn.net/Ace_Shiyuan/article/details/100265513 文件IO这块的思维导图做的很不错

https://blog.csdn.net/qq_36782456/article/details/72329144

Linux 2.6.24 源码

简述

系统调用的IO通常是不带缓冲的IO。

文件的描述符

对内核而言,所有打开的文件都通过文件描述符进行引用,文件描述符是一个非负整数。

即使是用标准库打开的流文件,其底层也是内核通过文件描述符引用。

在后文剖析文件模型时,你会发现,所谓的文件描述符其实就是一个指针数组的下标。

当打开/创建文件 open() / creat() 时,内核向进程返回一个文件描述符。当读/写一个文件时,将这个文件描述符作为参数调用 read() / write()

一个进程能够打开的文件是有限的,可以用下面的代码查看一个进程能同时打开文件的最大数量,在Linux 2.4 的系统上这个结果是 1024。

有三个特殊的文件描述符为系统所占有 :0 (stdin) 1 (stdout) 2 (stderr)

在#include <unistd.h> 中 这些文件描述符用符号常量 STDIN_FILENO , STDOUT_FILENO , STDERR_FILENO

相关系统调用函数

#include <fcntl.h>

  • 打开或创建文件 open()

  • 创建文件 creat()

    实际上等效于 open(name, O_WRONLY | O_CREAT | O_TRUNC , mode); 见Linux 2.6.24 源码

    asmlinkage long sys_creat(const char __user * pathname, int mode)
    {
    	return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
    }
    
  • 读取文件内容 read()

  • 向文件中写 write()

  • 关闭进程打开的文件描述符 close()

  • 改变读写文件的位置 lseek()

    每个打开的文件都有一个当前文件偏移量,当打开一个文件时,除非指定 O_APPEND 选项,否则这个偏移量被设置为 0。通常读写操作都会默认从当前文件偏移量开始,并且使偏移量增加读写字节数。

    可以使用 这个函数显式为一个打开的文件设置其偏移量。

    off_t lseek(int fd, off_t offset, int whence);

    • 对于参数 offset 的解释与参数 whence 有关:

      所以如果想设置当前偏移量为文件开始处 lseek(fd, 0, SEEK_SET);

      同理文件结束处 lseek(fd, 0, SEEK_END);

    • 若函数执行成功 则返回新设置的文件偏移量。

      执行失败 返回 -1 , 并将 errno 设置为 ESPIPE

posted @ 2019-11-27 11:40  沉云  阅读(133)  评论(0编辑  收藏  举报