Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119942
  • 博文数量: 30
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-14 10:05
个人简介

坚持学习,每天进步一点点……

文章分类

全部博文(30)

文章存档

2017年(13)

2016年(17)

分类: C/C++

2017-07-11 21:57:06

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
阅读(2174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~