Linux的文件基础操作
打开、关闭、创建、写入、读出操作。
Linux通过调用相关的文件I/O函数来完成相应的操作。(open、create、write)
这些函数通常被称为"不带缓冲的I/O操作函数"。
常见的文件操作流程:
任何被打开的文件在操作完成后,必须被关闭,否则容易出现错误。
打开和关闭文件
-
打开
open函数,用于在Linux中打开一个文件
如果文件不存在,则先创建一个,然后打开
如果操作成功,返回文件对应的文件描述符,如果操作失败,返回-1
对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);//如果打开的文件不存在,则先创建 //fcntl.h,是unix标准中通用的头文件,其中包含的相关函数有 open,fcntl,shutdown,unlink,fclose等! //sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。 //sys/stat.h 是unix/linux系统定义文件状态所在的伪标准头文件。
对open函数的各个参数和应用实例的说明:
-
pathname参数
用于传递包含了路径的完整文件名称
-
flags参数
用于指定打开文件的方式,常用的三种标志
- 只读:O_RDONLY,通常定义为0
- 只写:O_WRONLY,通常定义为1
- 读写:O_RDWR,通常定义为2
在对一个文件进行相应的操作的时候,必须要注意文件本身的权限,对一个文件进行操作权限不够的操作将会返回一个错误
flags参数中以上三个参数是必须唯一的,这些关键字之间不能用"OR"来连接,只能选择其中一个。
flags还可以使用以下可选的参数:
表中给出的标志可以混合使用,各标志之间用 "|"符号连接。(有些标志可以在文件打开后利用fcntl函数进行修改)
纠正:应为O_CREAT
实际上,第一个参数为int型参数,该数的每位对应一个操作,符号"|“是将它们按位或,即加起来,使得需要操作的位被置为"1”
-
mode参数说明
如果仅仅需要打开一个文件,可以不使用第三个参数
如果要充分考虑到文件可能不存在,再次打开之前就需要创建,此时需要使用mode参数
mode参数值:
mode参数支持"或"运算,可以同时使用上表中的一个或者多个参数,可以使用"|"关键字来直接连接或者对其对应的值进行计算之后获得最后的数值进行直接调用。
-
-
close函数
用于关闭一个已经打开的文件,如果关闭成功,返回0,否则返回-1
对close函数的标准调用格式说明:
#include<unistd.h> int close(int fd);
当对文件进行打开和关闭操作时,还会对其相关信息产生相应的影响:
- 当打开一个文件的时候,该文件描述中的引用计数值加1,而关闭一个文件时,该文件描述中的引用计数器值减1,当引用计数器的值减为0时,系统调用close函数不仅将释放该文件的描述符,而且也将释放该文件所占的描述表项。
- 关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显示的利用close关闭文件。
- 当关闭的不是一个普通文件时,可能会产生一些其他影响,例如关闭管道文件的一端时,将影响到管道的 另一端。
close的参数为文件描述符,通常来说这个符号为其他函数的返回值,例如open函数。
例1:应用代码在当前工作目录下以读写打开方式打开一个名为"opentest"的文件,如果文件不存在,则创建文件,创建该文件时使 用S_IRWXU关键字给予该文件读写操作的权限。
//一个标准的open函数调用实例,打开文件opentest,如果没有则创建 //然后返回文件的描述符,并且关闭文件后退出 #include<stdlib.h> #include<fcntl.h> #include<stdio.h> int main(){ int fd; //文件描述符 int temp; fd=open("./opentest",O_RDWR|O_CREAT,S_IRWXU); printf("The Descriptor is %d\n",fd); //输出文件描述符 temp=close(fd); //关闭文件 exit(0); }
例2:打开和关闭指定文件的应用实例
使用open函数在当前工作目录下打开或者创建一个文件的应用实例。
利用main函数的argv参数来传递用户指定的文件名。
以下为一个允许用户输入任意字符串作为打开或者创建文件名称的实例
//使用argv来传递待打开或者创建文件参数的应用程序 #include<stdlib.h> #include<fcntl.h> #include<stdio.h> int main(int argc,char*argv[]){ int fd; int temp; if(argc!=2){ printf("error\n"); } else{ fd=open(*(argv+1),O_RDWR|O_CREAT,S_IRWXU); printf("The file descriptor is %d\n",fd); //输出文件描述符 temp=close(fd); } exit(0); }
在传递argv参数之前,应先利用argc参数来检查argv参数的数目是否正确。