设备文件和IO

C标准库函数与系统函数的关系

设备文件和IO
1、C语言标准函数是建立在系统库函数之上的,C标准库函数的IO函数读写文件时会返回一个FILE*指针,其指向一个结构体,如图所示:
设备文件和IO
1)文件描述符:为一个整数,使用系统函数open时产生,其作用相当于文件描述符表的一个索引,可以通过文件描述符表找到其fd所指向文件的指针。

2)PCB(programming control block):进程控制块。
linux每运行一个程序操作系统都会为其分配一个0~4G的地址空间(虚拟地址空间),0-3G为用户区,3-4G为内核空间(PCB位置),每个进程之间只有一个公共的内核空间(进程间的通信就在内核空间进行),每个进程对应一个PCB,对应一个tast_struct结构体,每个PCB中都维护一个文件描述符表。

3)文件描述符表:一个进程对应一个task_struct,一个tast_struct有一个文件描述符表,一个进程固定打开三个流(stdin、stdout、stderr,即三个文件描述符),其占用了文件描述符表的前三个项,每打开一个文件,都会取空闲的最小项作为文件描述符。
标准输入STDIN_FILENO=0
标准输出STDOUT_FILENO=1
标准错误STDERR_FILENO=2

4)缓存区:缓存区默认大小为8192B。
对文件进行读写时,先将数据读写进缓存区,然后再调用应用层的API进行写操作,然后再将内容写到内核缓存区,然后内核API再将数据写进磁盘。
(缓存区优点:由于磁盘读写速度较慢,使用缓存区可以减少I/O操作,提高读写效率。)

5)C标准缓存区刷新条件:缓存区满、程序的正常结束、fclose()函数,或者可以用fflush()函数手动刷新,终端缓存区遇到\n换行符也会自行刷新。

6)内核缓存区刷新条件:有一个固定的守护进程会定时刷新缓存区。
https://www.cnblogs.com/hanxiaoyu/p/5677677.html(stuct file)
https://blog.csdn.net/huangshanchun/article/details/46388907(C标准和系统函数的关系)
https://blog.csdn.net/eleanor_12/article/details/53560830

open系统调用

-函数原型
int open(const char *path, int flags,mode_t mode);
-参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode&(~umask)
-返回值
打开成功,返回文件描述符;
打开失败,返回-1
flags:
设备文件和IO
mode(访问权限):
设备文件和IO

read系统调用

-函数原型:
int read(int fd, void *buf, size_t nbytes);
-参数
fd :想要读的文件的文件描述符
buf: 指向内存块的指针,从文件中读取来的字节放到这个内存块中
nbytes: 从该文件复制到buf中的字节个数
-返回值
如果出现错误,返回-1
返回从该文件复制到规定的缓冲区中的字节数,文件结束,返回0否则

write系统调用

用write()系统调用将数据写到一个文件中
-函数原型:int write(int fd,void *buf,size_t nbytes);
-函数参数:
fd :要写入的文件的文件描述符
buf: 指向内存块的指针,从这个内存块中读取数据写入 到文件中
nbytes: 要写入文件的字节个数
-返回值
如果出现错误,返回-1
如果写入成功,则返回写入到文件中的字节个数