使用Linux的文件API,经常看见一个东西,叫做文件描述符.
什么是文件描述符?
(1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了,以后我们应用程序如果要操作这一个动态文件,只需要用这个文件描述符进行区分。
(2)文件描述符就是用来区分一个程序打开的多个文件的。
(3)文件描述符的作用域就是当前进程,出了当前进程这个文件描述符就没有意义了
(4)文件描述符fd的合法范围是0或者一个正数,不可能是一个负数
(5)open返回的fd必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd去指定关闭这个文件。如果在我们关闭文件前fd丢了,那么这个文件就没法关闭了也没法读写了
1)打开与读取文件
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 7 int main(int argc, char const *argv[]) { 8 9 int fd = -1; //文件描述符 10 11 //打开文件 12 fd = open( "ghostwu.txt", O_RDWR ); 13 14 if ( -1 == fd ) { 15 printf("文件打开失败\n"); 16 }else { 17 printf("文件打开成功,fd=%d\n", fd ); 18 } 19 20 //读取文件 21 int count = 0; 22 char buf[20]; 23 count = read( fd, buf, 50 ); 24 if ( -1 == count ) { 25 printf("文件读取失败\n"); 26 }else { 27 printf("文件读取成功,实际读取的字节数目为:%d\n内容为%s\n", count, buf ); 28 } 29 30 //关闭文件 31 close( fd ); 32 33 return 0; 34 }
需要在当前目录下存在ghostwu.txt这个文件,否则打开的时候失败,这里涉及2个api
int open(const char *pathname, int flags);
open非常简单,第一个参数就是文件路径, 第二个是文件模式,在man手册中还提供了其他几种方式。
ssize_t read(int fd, void *buf, size_t count);
第一个参数为文件描述符,就是open返回的那个值
第二个参数buf用来存储从文件中读取的内容
第三个参数,表示希望从文件中读取的内容( 注:这个count数字可以随便给,最终以返回的实际数目(read的返回值)为准
2)打开与写入文件
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 #include <string.h> 7 8 int main(int argc, char const *argv[]) { 9 10 int fd = -1; //文件描述符 11 12 //打开文件 13 fd = open( "ghostwu.txt", O_RDWR ); 14 15 if ( -1 == fd ) { 16 printf("文件打开失败\n"); 17 }else { 18 printf("文件打开成功,fd=%d\n", fd ); 19 } 20 21 //写文件 22 char buf[] = "I love Linux, Linux is very very good!!!"; 23 int count = 0; 24 count = write( fd, buf, strlen( buf ) ); 25 if ( -1 == count ) { 26 printf("文件写入失败\n"); 27 }else { 28 printf("文件写入成功,实际写入的字节数目为:%d\n", count); 29 } 30 31 //关闭文件 32 close( fd ); 33 34 return 0; 35 }
ssize_t write(int fd, const void *buf, size_t count);
第一个参数为文件描述符,就是open返回的那个值
第二个参数buf用来存储写入的内容
第三个参数,表示希望写入的文件大小