写文件
#include<stdio.h>
#include<sys/types.h>#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(){
umask(0);//在创建新文件或目录时屏蔽掉新文件或目录不应有的访问允许权限
int fd = open("file",O_WRONLY|O_CREAT,0644);//只写一个文件,如果不存在就创建它,缺省0644
if(fd < 0){
perror("open");
return 1;
}
int count = 5;
const char *msg = "hello bit!\n";
int len = strlen(msg);
while(count--){
write(fd,msg,len);//往fd里写,msg:要写的内容,len:期望写入多少个字节的数据,返回值:实际写了多少
}
close(fd);
return 0;
}
运行完程序后会出现一个文件file,打开文件就是你写进去的内容
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2 。0,1,2对应的物理设备一般是:键盘,显示器,显示器。写文件时打开的是fd,当我们将fd改为1时,是将文件里的内容输出到显示器上。如下:
读文件
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
int main(){
int fd = open("file",O_RDONLY,0644);
if(fd < 0){
perror("open");
return 1;
}
const char *msg = "hello bit!\n";
char buf[1024];
while(1){
ssize_t s = read(fd,buf,strlen(msg));
if(s > 0){
printf("%s",buf);
}else{
break;
}
}
close(fd);
return 0;
}
当我们把fd改为0时,对应的物设备时键盘,它在等我们输入,输入一条,显示一条。要退出时,按ctrl d结束,意思是读到文件结尾,相当于return 0
纵向对比文件描述符fd和FILE
fd:通过对open函数的使用,我们知道了文件描述符就是一个小整数,文件描述符没有负数。当打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*file,指向一张表file_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针。所以,本质上,文件描述符就是该数组的下标,所以只要拿着文件描述符,就可以找到对应的文件。
FILE(文件指针/句柄):因为IO相关函数与系统调用接口对应,并且库函数封装系统调用。所以,本质上,访问文件是通过fd访问的。所以c库当中的FILE结构体内部,必定封装了fd。所以FILE比fd更适合跨平台,应多用fopen,少用open。
文件描述符(fd)是唯一的,文件指针(FILE)不是唯一的,但指向的对象也应该是唯一的。