回顾C语言之 - 文件如何被写入
fopen
fwrite
fread
fclose
fseek
…
这一系列函数都是C语言中对文件进行的操作:
int main()
{
FILE* fp=fopen("text","w");
char str[20]="write into text";
fputs(str,fp);
fclose(fp);
return 0;
}
而上述C语言指令本质上都是封装了操作系统的指令实现了具体操作,例如:fopen封装了open,fclose封装了close,所以不用C语言提供的fopen…函数,也可以实现文件操作
int main()
{
int fd=open("text",O_WRONLY|O_CREAT|O_TRUNC,0666);
char str[100]="write into text";
write(fd,str,sizeof(str));
close(fd);
return 0;
}
Linux中的文件是怎么被管理的
了解OS中对文件的基本操作后,已经能够自行管理文件,如何决定想要管理的文件是那个呢?现在开始探究文件是如何被管理的
1、想要对文件进行操作,需要先打开文件
电脑的内存容量是偏小的,所以文件都会被保存在磁盘上面。只有当进行操作的时候,才会加载到内存中
2、谁来打开这些文件
这些文件都是由进程负责打开和关闭,而对其进行管理则需要用到文件描述符fd
3、fd(文件描述符)是什么
文件描述符概括来说就是一个描述符对应一个文件,每当一个文件被打开,都会被赋予一个文件描述符
下图便是Linux中对于文件管理所用的结构体
在
task_struct
中,存在files_struct
结构体,用来保存文件通用的一些最基本属性。
在该结构体中又存在一个file
结构体数组,用来保存具体文件,而前文所说的fd代表的就是这个数组fd_array[ ] 的下标(即每一个下标对应一个文件)。其中,在fd_array[ ]中,前3个下标位置默认由
stdin
stdout
stderr
占用
/*下面是Linux中这几个结构体的内容*/
struct task_struct {
...
struct files_struct *files;
...
}
struct files_struct {
atomic_t count;
struct fdtable *fdt;
struct fdtable fdtab;
spinlock_t file_lock ____cacheline_aligned_in_smp;
int next_fd;
struct embedded_fd_set close_on_exec_init;
struct embedded_fd_set open_fds_init;
struct file * fd_array[NR_OPEN_DEFAULT];
};
struct file {
struct file *next;
struct file *parent;
char *name;
int lineno;
int flags;
};