open函数是一个不带缓冲的I/O函数,所谓的不带缓冲指的是其每次都是调用内核中的一个系统调用。今天在看到open函数时感觉有几个标志位经常可能会用到:
1.O_APPEND:每次写时都写到文件的末尾,相当于lseek(fd,0,SEEK_END)
2.O_CREAT:文件不存在则创建它,用这个参数是需要指明第三个参数mode,以指定文件的访问权限位。相当于creat函数,但不同的是creat函数以只写方式打开所创建的文件。
3.O_DIRECTORY:如果path的路径不是目录,则出错。
4.O_EXCL:如果指定了O_CREAT,则当文件存在时返回错误,不存在时则创建它。此操作是一个原子操作,可用于判断文件是否存在。相当于:access(path,F_OK)
5.O_NONBLOCK:对于打开的FIFO、块文件或者是特殊的字符文件,会被设定为非阻塞模式。设置此标志后,对于FIFO或设备文件,当调用read函数去读取数据时,如果没有数据可读或者是已经到达文件末尾,则read直接返回0.
6.O_SYNC:使每次write等待物理I/O操作完成。
7.O_TRUNC:文件存在并且以只写或者是读写模式打开,则将文件长度截为0。
open函数返回系统中一个可用的最小的文件描述符的值。
写一个简单的程序验证O_CREAT和O_EXCL的作用:
#include
#include
#include
#include
int main()
{
int fd = open("test",O_CREAT|O_EXCL|O_RDWR,0666);
if(fd == -1)
{
printf("%s\n",strerror(errno));
return -1;
}
else
printf("success\n");
close(fd);
return 0;
}
运行结果:
第一次:success
第二次:File exists
阅读(2247) | 评论(0) | 转发(0) |