open函数

1
2
3
4
5
头文件:#include<fcntl.h>//在centos6.0中只要此头文件就可以
#include<sys/types.h>
#include<sys/stat.h>
功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文
件描述符对指定文件进行读取与写入的操作。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
参数说明:
1.pathname
要打开或创建的目标文件
2.flags
打开文件时,可以传入多个参数选项,用下面的
一个或者多个常量进行“或”运算,构成falgs
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR: 读,写打开
这三个常量,必须制定一个且只能指定一个
O_CREAT: 若文件不存在,则创建它,需要使
用mode选项。来指明新文件的访问权限
O_APPEND: 追加写,如果文件已经有内容,这次打开文件所
写的数据附加到文件的末尾而不覆盖原来的内容
O_EXCL如果要创建的文件已存在,则返回-1,并且修改errno的值

O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)

O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式

O_SYNC:使每次write都等到物理I/O操作完成,包括由该write操作引起的文件属性更新所需的I/O。

判断文件是否存在 O_CREAT | O_EXCL 必须同时使用

ps:open函数具体使用那个,和具体应用场景相关,如目标文件存在,使用两个参数的open,如果目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限

创建文件时 :本地有一个掩码,可以用umake命令查询

文件实际权限=文件掩码取反 & 文件权限

1
2
3
4
5
6
7
8
9
例如创建一个文件的权限是777,文件掩码是002
111 111 111 777
000 000 010 002
111 111 101 &111 111 111 777按位取反得来

111 111 101
&
111 111 111 =
111 111 101 实际权限是775

返回值

1
2
3
成功:新打开的文件描述符
失败:-1
open返回的文件描述符一定是最小的而且没有被使用的

close

1
2
3
4
5
6
7
8
9
10
11
头文件:#include<unistd.h>
功能:关闭一个已经打开的文件


int close(int fd)
参数说明:
fd:是需要关闭的文件描述符


成功:返回0;
失败:返回-1,并设置errno
打开的文件描述符一定要记得关闭,否则资源会被大量的占用,导致内存不够

open函数中的erron全局变量

错误宏定义位置

1
2
3
4
5
第1-34个错误定义
/usr/include/asm-generic/errno-base.h

第35-133个错误定义
/usr/include/asm-generic/errno.h

是记录系统的最后一次错误代码.

代码是一个int型的值

使用perror读错误的信息

1
2
3
4
5
6
头文件
stdio.h
void perror(const char *s)
用来将上一个函数发生错误的原因输出到标准设备(stderr)
参数s所指的字符串会先打印出,后面再加上错误原因字符串
此错误原因依照全局变量errno的值来决定要输出的字符串