Linux open函数

open 函数用于打开和创建文件。以下是 open 函数的简单描述

#include <fcntl.h>
int open(const char *pathname, int oflag, ... );

返回值:成功则返回文件描述符,否则返回 -1

对于 open 函数来说,第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。

O_RDONLY  只读模式

O_WRONLY  只写模式

O_RDWR  读写模式

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

O_APPEND  每次写操作都写入文件的末尾

O_CREAT  如果指定文件不存在,则创建这个文件

O_EXCL  如果要创建的文件已存在,则返回 -1,并且修改 errno 的值

O_TRUNC  如果文件存在,并且以只写/读写方式打开,则清空文件全部内容

O_NOCTTY  如果路径名指向终端设备,不要把这个设备用作控制终端。

O_NONBLOCK  如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

以下三个常量同样是选用的,它们用于同步输入输出

O_DSYNC  等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。

O_RSYNC  read 等待所有写入同一区域的写操作完成后再进行

O_SYNC  等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

open 返回的文件描述符一定是最小的未被使用的描述符。

如果 NAME_MAX(文件名最大长度,不包括'\0')是 14,而我们想在当前目录下创建文件名长度超过 14 字节的文件,早期的 System V 系统(如 SVR2)会截断超出部分,只保留前 14 个字节;而由 BSD 衍生的(BSD-derived)系统会返回错误信息,并且把 errno 置为 ENAMETOOLONG。

POSIX.1 引入常量 _POSIX_NO_TRUNC 用于决定是否截断长文件名/长路径名。如果_POSIX_NO_TRUNC 设定为禁止截断,并且路径名长度超过 PATH_MAX(包括 '\0'),或者组成路径名的任意文件名长度超过 NAME_MAX,则返回错误信息,并且把 errno 置为 ENAMETOOLONG。

open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值

 参考格式 if(fd=open("/dev/ttys0",O_RDWR | O_NOCTTY | O_NDELAY))<0 {printf("cannot open"};

 int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;

 打开的操作类型有如下几种

   1) O_RDONLY 只读打开

   2) O_WRONLY 只写打开

   3) O_RDWR 读、写打开

   4) O_APPEND 每次写时都加到文件的尾端

   5) O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。

   6) O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。

   7) O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。

   8) O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。

   9) O_NONBLOCK 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I
/ O操作设置非阻塞方式。

   10)O_SYNC 使每次w r i t e都等到物理I / O操作完成。

   这些控制字都是通过“或”符号分开(|)

来源:http://blog.sina.com.cn/s/blog_54f82cc201010oow.html


最新文章

  1. 【BZOJ-1656】The Grove 树木 BFS + 射线法
  2. 关于handler 和 looper 的问题
  3. PHP使用字符串名称调用类的方法
  4. XML Data Type Methods(一)
  5. 数据结构之图 Part2 - 1
  6. &lt;span&gt;和&lt;a&gt;的margin上下和padding上下不起作用的原因和解决
  7. Linux系统目录分析
  8. MySQL 时间戳(Timestamp)函数
  9. Android中如何将dp,dip,sp与px相互转化
  10. Android 传感器开发
  11. 完整教程--idea使用git进行项目管理
  12. Android Studio项目引入外部库注意事项(zxing)
  13. 2017BUAA软工个人项目之数独生成与求解
  14. FlowLayout OnSizeChanged
  15. 添加exe为windows service服务
  16. 邮件中的CC和BCC含义
  17. 数据库访问辅助类SqlHelper
  18. Notes of the scrum meeting(12.9)
  19. flume+kafka+storm打通过程
  20. 更改windows服务的配置文件(app.config)必须重启服务才能生效吗?

热门文章

  1. python - django 项目部署 Ubuntu 服务器后接口访问一直 502 问题
  2. python - django 设置自定义文件保存路径
  3. 快站中如果点击报错,则用jquery的点击方式来书写!!!
  4. Numpy | 12 数组操作
  5. 错误解决Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: pers.zhb.domain.Student column: classno (should be mapped with insert=&quot;false&quot; update=&quot;false&quot;)
  6. Luogu P2447 [SDOI2010]外星千足虫 高斯消元
  7. 使用Lua脚本通过原子减防止超卖
  8. MySql的执行计划
  9. Ubuntu16.04.1上搭建分布式的Redis集群,并使用C#操作
  10. 用Eclipse的maven方式创建JFinal项目