开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:open_close 函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/10975
open_close 函数
内容介绍
一、open 函数
二、close 函数
一、 open 函数
1.简介
系统调用级的I/O函数提供的接口几个函数都是内核提供的,通过open函数可以打开一个文件,open函数是由内核提供的
#include < sys / types . h >
#include < sys / stat . h >
#include fcntl . h >
需要包含这几个同文件
2.文件调用方式
①当文件存在时使用:
int open ( const char* pathname , int flags );
第一个参数char* pathname是打开文件的路径,相对路径绝对路径都可以,int flags是一个整形的,整形的flag其实就是打开的方式,F/open可以用只读的方式打开以只写的方式打开以可读可写的方式打开,这是打开方式,注意打开文件时会返回一个整数,如果打开成功就返回一个文件描述符,文件描述符返回值代表了打开的文件在进程当中,以后对这个文件进行读写时对文件描述符进行操作。
②当文件不存在时使用:
int open ( const char * pathname , int flags , mode _ t mode );
如果不存在会新建一个文件,如果存在就直接打开了,在新建文件时每个文件都有权限,可读可写可执行,mode就是那个文件的权限。同样会返回文件描述符那个文件描述符就代表了创建的并且打开的文件
③参数:
pathname ;文件的路径及文件名。
flags : open 函数的行为标志。
mode :文件权限(可读、可写、可执行)的设置。
④返回值:
成功返回打开的文件描述符
失败返回-1,可以利用perror去查看原因
3.flags的取值及其含义
O_RDONLY 以只读的方式打开
O_ WRONLY 以只写的方式打开
O_RDWR 以可读、可写的方式打开
所以open这个函数在用的时候应该首先定义一个变量,变量将来接一下文件描述符,第一个参数是文件的路径,当前目录下的test.txt文件路径,第二个参数是O_RDONLY以只读的方式打开这个文件得到一个文件描述符判断一下,如果fd=-1代表打开失败,就可以perror传一个open进来,将来打印出错信息时先打open后面跟着真正的出错信息,返回0结束程序。
int fd ;
fd = open ("./ test . txt ",0 RDONLY );
if ( fd ==-1)
{
perror (" open ");
return 0;
}
注意这个是把常量直接放在这,可以直接chat*path,初始化一下,直接放一个指针变量path也行。打开这个文件以只读的方式打开
int fd ;
char * path ="./ test . txt ";
fd = open ( path ,0 RDONLY )
if ( fd ==-1)
{
perror (" open "");
return 0;
}
这是以只读的方式打开,还有只写,可读可写的打开方式
flags除了取上数值之外,还可以与下列值位或
O _CREAT 文件不存在则创建文件,使用此选项时需使用 mode说明文件的权限
O _EXCL如果同时指定了0_CREAT,且文件已经存在,则出错
O _TRUNC如果文件存在,则清空文件内容
O_ APPEND写文件时,数据添加到文件末尾
0_NONBLOCK当打开的文件是FIF0、字符文件、块文件时,此选项为非阻塞标志位
①O _CREAT用法
open打开时可能会有int open ( const char * pathname , int flags , mode _ t mode );这种方式,没有回帮助创建,如果是这样的话写一下调用代码,同样要定义变量fd open打开这个文件的路径,以只写的方式打开,如果文件不存在按位或,第三个参数式是0666,666换算成二进制是110110110,以0开头是八进制,文件拥有可读可写不可执行,这是拥有者同组用户,其他用户的权限
int fd ;
char * path ="./ test . txt ";
fd = open ( path ,0_ WRONLYIO _ CREAT ,0666);//110110110
//如果文件存在的话,直接打开文件
//如果文件不存在的话,创建文件并打开
②O _EXCL:
一般是检查文件是否存在的,指定了O _CREAT又指定了O _EXCL,打开文件以只写的方式打开,如果没有去新建文件并且检查文件是否存在然后0666新建了文件,这种情况下如果文件存在则open一定会失败,如果文件不存在open可能成功,返回文件描述符。
而上面那种只有O _CREAT的时候如果文件存在直接打开文件,如果文件不存在创建文件并打开,可能因为其他原因失败。但下面这个open加了O _EXCL参数,只有文件存在,open一定会失败。
int fd ;
char * path ="./ test . txt ";
fd = open ( path ,0_ WRONLYIO _ CREATIO _ EXCL ,0666);//110110110
//如果文件存在,则 open 一定会失败
//如果文件不存在的话, open 可能成功,返回文件描述符
③O _TRUNC
F/open双引号里只要带W就是打开文件并清空,文件不存在帮你新建,文件存在帮你清空再打开
④O_ APPEND
如果flags可以按位或上O_ APPEND相当于打开文件时在文件的末尾
0_NONBLOCK:
blok是阻塞,打开文件时可以以阻塞的方式打开,也可以是非阻塞方式NONBLOCK就是非阻塞,讲解命名管道时会用到这一个选项。以非阻塞方式打开去read时有东西就读,没东西也不会停在那一直等,这是非阻塞将来会讲,现在先不讲那么细致。
4.mode 的取值和含义
前四个红有一个特点,都在第三位上,7是111,4是01110,2是010,1是001,这几个红可以按位或,相当于0***,八进制相当于第一个*,可以用这几个红给第一个*按位或赋值。
中间几个在倒数第二个位置,按位或0***,给倒数第二个赋值。
这三组红一组在第三个位置上,一组在倒数第二个位置上,一组在最后一个位置上,可以直接用0***代替mode
SIRWXU 00700 文件所有者的读、写、可执行权限
S IRUSR 00400 文件所有者的读权限
S IWUSR 00200 文件所有者的写权限
S IXUSR 00100 文件所有者的可执行权限
SIRWXG 00070 文件所有者同组用户的读、写、可执行权限
SIRGRP 00040 文件所有者同组用户的读权限
SIWGRP 00020 文件所有者同组用户的写权限
SIXGRP 00010 文件所有者同组用户的可执行权限
SIRWXG 00070 文件所有者同组用户的读、写、可执行权限
SIRGRP 00040 文件所有者同组用户的读权限
SIWGRP 00020 文件所有者同组用户的写权限
SIXGRP 00010 文件所有者同组用户的可执行权限
SIRWXO 00007 其他组用户的读、写、可执行权限
S IROTH 00004其他组用户的读权限
SIWOTH 00002 其他组用户的写权限
S IXOTH 0000 其他组用户的可执行权限
二、 close 函数
1.简介
close相对较简单,与fclose差不多,要想关闭一个文件传出文件对应的文件描述符就行,就会将fd所代表的文件关掉,返回一个整形。
关闭一个文件
# include < unistd . h >
int close ( int fd );
参数:
fd 是调用 open 打开文件返回的文件描述符。
返回值:
成功返回0。
失败返回﹣1,可以利用 perror 去查看原因。
2.在程序中关闭文件方法:
如果让fd代表那个文件描述符定义一个变量err,close关闭fd所代表的文件,如果err不等于零关闭失败,打印出错信息,先打传进去的字符串,后面跟着真正出错的信息。
int err ;
err = close ( fd );
if ( err !=0)
perror (" close ");
return 0;