文件fd内容
操作文件,先创建一个文件指针,FILE* fp
fopen(“A”, “B”) - - - 打开文件A,用B方法打开,B的选项有:
w - 写方式:如果打开的文件不存在,则在当前路径下新建指定的文件,w默认打开文件的时候就会把文件清空。
a - 追加:每次打开文件并追加(appending)内容,不清空内容。
echo “nihao” > log.txt - - - 每次写入文件内容都是新的,都是先清空再写入。> 也就是文件的w操作,可新建或清空
echo “nihao” >> log.txt - - - 相当于 a 方式给文件中追加信息。
fclose(fp) - - - 利用文件指针关闭文件
perror(“fopen”) - - - 如果打开失败,利用这个函数返回打开错误的信息。
fprintf(FILE* fp, const char* format, …) - - - 把指定的内容写入文件指针fp所指向的文件中。
打开文件是进程在打开文件,每一个被打开的文件,在OS中一定存在对应的描述文件属性的结构,类似于PCB。
文件 = 属性 + 内容,只要存在一个文件,就会占据空间,不论文件中有没有内容。
操作文件本质是进程在操作。
文件在磁盘上,磁盘是硬件,向文件写入本质是向硬件中写入,而硬件的管理者是操作系统,用户没有权利直接写入,因此得通过操作系统写入,所以存在系统调用接口。因此 c 中fopen等函数都是对系统调用接口的封装。
系统调用接口:
flags - - - 想怎样创建文件,是一个整数,但可以传递很多标记位。
pathname - - - 可以带路径写上文件名,也可以不带路径。
open 失败返回-1,成功返回文件描述符 也是整形。
open 带两个参数的一般是操作已经存在的文件
open 带三个参数的,就是多写一个文件的权限,一般是文件如果不存在用三个参数的。
open 的第三个参数给的权限一般会和系统默认权限umask结合后再设置文件权限,如果不想结合系统的umask,可以手动调用umask(0),直接把当前进程的系统默认权限掩码改成 0,这样就不会影响open第三个参数给的权限。
write 把指定的buf的信息,有count大小,写到 fd 所对应的文件中。
man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //带两个参数的一般是操作已经存在的文件
int open(const char *pathname, int flags, mode_t mode);//一般是文件如果不存在用三个参数的
#include <unistd.h>
int close(int fd);
ssize_t write(int fd, const void *buf, size_t count);
man 2 umask
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
flags - - - 就是标志位的传递,看着是一个整数,但其实是一个位图。
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
O_TRUNC : 写入打开的时候,如果文件存在,重新写入的话就清空
文件描述符 0/1/2
0 :标准输入 键盘 - - stdin
1 :标准输出 显示器 - - stdout
2 :标准错误 显示器 - - stderr
文件描述符的本质是:内核中进程对应的文件描述结构体内的指向文件链表的数组的下标。
首先,进程的PCB中会有一个描述文件的结构体 files ,
结构体 files 中存有指向文件属性信息列表的数组
文件属性信息列表会开辟一个文件内核级缓存
无论读写文件,都是把文件内容加载到文件内核级的缓冲区中。对文件内容的操作都是在缓冲区中操作,最后通过缓存进行刷新磁盘内容。
open 就是在创建 file,开辟文件缓冲区,查看进程文件描述符表,把file地址填写进文件数组中,返回数组下标。
linux 中一切皆文件
对于任何IO设备,都有 struct file 可以访问它,struct file 访问不同的设备,这种技术就是多态。struct file 就是存放IO设备的属性和方法。
再OS中,访问文件只认文件描述符。在C语言中,fopen,fclose等函数都是库函数,返回的FILE类型是一个 c 语言的结构体,这个FILE 结构体中肯定存有 fd (文件描述符)。可以查看(stdin stdout stderr 也是FILE类型的):
下面演示一个从一个窗口给另一个窗口输入东西:
linux一切皆文件,则窗口也可以看作是一个文件,找到文件信息,则可以利用open、write函数写: