基础I/O--文件描述符

一:文件描述符

1.文件I/O操作函数

系统调用:

int open(const char *pathname, int flags, mode_t mode);
第一个参数为文件名,第二个参数为按照什么方式打开,第三个是如果文件不存在要创建文件文件的权限,可以省略。
这里写图片描述
ssize_t write(int fd, const void *buf, size_t count);///从指定空间获得数据放在指定文件中
第一个参数是文件描述符,第二个是指定空间,第三个一次读取多少字节

c库函数:

ssize_t read(int fd, void *buf, size_t count);//count为0,返回值为0

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );//从一个二进制方式打开的文件获得数据放在指定空间,返回值是实际读取文件的大小(字节)
buffer 指定空间的地址// size每次读取的基本单位//count一次读取多少个元素

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );//从指定空间获得数据放在指定文件中

这里写图片描述
这里写图片描述
这里写图片描述

2.缓冲数据有三种形式:

(1)无缓冲:就是直接输出
(2)行缓冲:(朝显示器写)
(3)全缓冲:(朝文件写)因为是朝硬盘写,所以尽量避免内存与硬件进程I/O交流。
注:系统调用不受缓冲区影响,这里的缓冲区是c的缓冲区。
FILE结构体中有:
(1)文件描述符
(2)缓冲区相关信息

3.shell脚本命令分为:

(1)内置命令:cd echo
(2)第三方命令:ls
shell脚本执行命令要创建子进程的原因;
不相信任何命令,如果shell不创建子进程就直接执行,要是执行失败,自己也会挂掉,所以让子进程去执行,除了自己的内置命令。

4.系统调用与库函数:

(1)操作系统给的接口,叫系统调用
(2)将系统调用二次封装形成库函数。

5.文件描述符:

概念:文件描述符就是一个从0开始的小整数(没有负数),当我们要打开文件时,操作系统就要管理文件(先描述,再组织),就要在内存中创建相应的数据结构,(file结构体),而一个进程默认要打开三个文件,所以进程PCB中要有一个*files指针,指向一张表files_struct,该表最重要的部分就是包含一个文件指针数组,每一个元素都是指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。
注:因为一个进程默认会打开三个 文件,(0–stdin,1—stdout, 2—stderr),所以自己在进程中打开文件,文件描述符默认是从3开始的。
这里写图片描述

6.重定向:输出重定向、输入重定向、追加重定向。
这里写图片描述

这里如果不刷新缓冲区,文件中就看不见内容,因为文件是全缓冲,而显示器是行缓冲,不刷新,内容就在缓冲区里。
这里写图片描述
本来应该输出到显示器上的内容,输出到了文件file,这种现象叫做输出重定向。即文件描述符不变,只是改变里内容。
echo “hello” > file 输出重定向
cat < file 输入重定向
echo “hello” >> 追加重定向

总结:

(1)站在操作系统的角度看文件描述符:一个进程,就有PCB,而PCB中有*files指针,指向一张带有文件指针数组的表,而文件描述符就是数组的下标。
(2)站在系统调用:先在硬盘中找到该文件,在内存中形成一个描述文件的结构体,链接到文件链表中,自己的进程调用的,在该进程 PCB中的*files指针指向的那张表files_struct,其中有文件指针数组,非配数组中没有被使用且最小的元素来保存文件结构体的地址,最后返回下标。
(3)站在C库函数 :里面的FILE结构体一定包含了a.一定封装了fd b.缓冲区相关信息。

猜你喜欢

转载自blog.csdn.net/virgofarm/article/details/80282395
今日推荐