open函数详解
2024-10-21 12:56:24
转载:https://www.cnblogs.com/frank-yxs/p/5925574.html
open函数用来在进程中打开文件,如果成功则返回一个文件描述符fd。
=======================================================
函数原型:
函数参数:
- pathname:打开文件的路径名
- flags:用来控制打开文件的模式
- mode:用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。
返回值:
- 调用成功时返回一个文件描述符fd
- 调用失败时返回-1,并修改errno
=======================================================
flags参数详解:
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:可读可写模式
上面三种模式在flags参数中不能同时出现但必须有一种出现,下面的参数是可选的。
- O_APPEND:以后每次写文件时都会先将当前文件偏移量设置到文件末尾,但是读文件时时不影响的
- O_CREAT:如果文件不存在则创建
- O_EXCL:要打开的文件如果存在则出错,必须要和O_CREAT参数一起使用
- O_TRUNC:打开文件的同时将文件中的内容清除
- O_NOCTTY:如果打开的文件是终端设备,则不将此设备设置为进程的控制终端
- O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式
- O_SYNC:使每次write都等到物理I/O操作完成,包括由该write操作引起的文件属性更新所需的I/O。
========================================================
open函数返回的文件描述符fd一定是未使用的最小的文件描述符。利用这个特性,可以改变0,1,2这三个文件描述符所指向的文件,由于进程默认会打开0,1,2这三个文件描述符,而且指向了键盘和显示器的设备文件。如果在open之前先进行close(1),然后再调用open函数就会返回最小的未使用的fd,也就是1。
=======================================================
如果文件不存在,而且又使用了O_CREAT标志,也就是会创建文件,创建文件时会给文件一定的权限,但是这个权限并不会限制该进程后面对该文件的操作。举个例子,如果创建文件时给的权限是0555,也就是所有用户都没有写的权限。但是程序后面还是可以对文件进行写操作。
=======================================================
当mode参数是由八进制数字给出的时候,如 0777 .要纠正一个错误,就是之前我认为 权限数字前面的 0 代表的是八进制的含义,其实并不是这样的,前面的 0 代表了权限修饰位,也就是set-user-id位、set-group-id位和sticky这三位的权限。
=======================================================
creat函数相当于open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode),由于open函数完全可以替代creat函数,所以现在基本上不用creat函数了。
最新文章
- 【Hibernate框架】flush机制
- jquery中的ajax方法参数总是记不住,这里记录一下。
- 原生JS:严格模式详解
- LeetCode 3 Longest Substring Without Repeating Characters 区间,想法 难度:1
- centos 6 安装 gitlib
- .net core 学习笔记(2)-中间件
- shell中判读文件存在的方法
- UVA 12169 Disgruntled Judge【扩展欧几里德】
- ubuntu vsftp 安装
- 解高次同余方程 (A^x=B(mod C),0<;=x<;C)Baby Step Giant Step算法
- Redirect and POST in ASP.NET
- Promise in AngularJS
- sqlplus命令手册
- MacTex XeLaTex xdvipdfmx:fatal: pdf_ref_obj(): passed invalid object. 报错的解决方法
- ffmpeg音频播放代码示例-avcodec_decode_audio4
- 【kafka】Java连接出现Connection refused: no further information的解决方法
- 为奋战在HIS创新路上的医院信息科赋能
- T-SQL GROUP BY子句 分组查询
- 【BZOJ3514】 Codechef MARCH14 GERALD07加强版
- LPC18xx/43xx SWD/JTAG Debug Connector
热门文章
- 基于【SpringBoot】的微服务【Jenkins】自动化部署
- 【转】C# ArcgisEngine开发中,对一个图层进行过滤,只显示符合条件的要素
- (译)RabbitMQ ——“Hello World”
- DirectX11 学习笔记10 - 用文件存储顶点布局
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
- Inside ARC — to see the code inserted by the compiler
- Shell脚本:推断用户和用户组是否已经存在/创建用户和用户组
- zzulioj--1638--Happy Thanksgiving Day - Say 3Q I(水题)
- TP5异常处理
- ORACLE RAC 11G 添加以及删除UNDO表空间