快乐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
。
-