通常我们写一个C程序在C标准库上进行一系列的编程,但是在c程序里如果我们要打开一个文件,我们都知道文件开始是存在硬盘上的,而操作文件是通过操作系统的。
那么我们就需要通过操作系统暴露的一些接口去间接的操作文件,而系统调用就是操作系统向外暴露的接口。
文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用;
而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作是对fd直接操作的系统调用的封装, 它的优点是带有I/O缓存
#include<stdio.h>
#include<string.h>
int main()
{
FILE*fp=fopen(".log","w");
const char*msg="hello word!\n";
if(fp==NULL)
{
perror("open");
return 1;
}
int i=0;
while(i<10)
{
fwrite(msg,1,strlen(msg),fp);
i++;
}
fclose(fp);
return 0;
}
但是此时我们打开文件使用的是fopen,而fopen是库函数,因此我们可以知道在fopen这个函数里是封装了系统调用函数open的,通过在fopen里调用open来打开文件。
FILE *fopen(const char *path, const char *mode);
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
第一个参数和fopen一样,都是要打开的文件名或者路径,第二个参数是选择以什么方式打开(只读?只写?读写?)
int open(const char *pathname, int flags, mode_t mode);
第一个参数和fopen一样,都是要打开的文件名,第二个参数是选择以什么方式打开(只读?只写?读写?),第三个参数mode表示ÿ