博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
阅读量:6213 次
发布时间:2019-06-21

本文共 2186 字,大约阅读时间需要 7 分钟。

lienhua34

2014-08-29

fcntl 函数可以改变已打开的文件的性质。

#include <fcntl.h>

int fcntl(int filedes, int cmd, ... /* int arg */);

fcntl 函数有 5 种功能:

1. 复制一个现有的描述符(cmd=F_DUPFD)。

2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD)。

3. 获取/设置文件状态标志(cmd=F_GETFL 或F_SETFL)。

4. 获取/设置异步 I/O 所有权(cmd=F_GETOWN 或F_SETOWN)。

5. 获取/设置记录锁(cmd=F_GETLK、F_SETLK 或F_SETLKW)。

下面说明一下前五个 cmd 值。

(1)F_DUPFD

复制文件描述符 filedes。新文件描述符作为函数值返回。跟 dup 函数的区别是:dup 函数返回的新文件描述符一定是尚未打开的描述符中最小的,而 fcntl 函数返回的新文件描述符是尚未打开的描述符中大于或等于第三个参数中各值的最小值。即 dup(filedes) 等价于 fcntl(filedes, F_DUPFD, 0)

(2)F_GETFD

获取 filedes 的文件描述符标志作为函数值返回。当前只定义了一个文件描述符标志FD_CLOEXEC(FD_CLOEXEC 即“执行时关闭”标志,设置了该标志,表示在执行一个 exec 时自动关闭该描述符。复制一个文件描述符时自动清除该标志,无论使用的是 dup 函数还是 fcntl 函数。)

(3)F_SETFD

设置 filedes 文件描述符标志。

(4)F_GETFL

获取文件描述符 filedes 的文件状态标志作为函数值返回。文件状态标志见表格 1,

文件状态标志  说明
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 为读、写打开
O_APPEND 每次写时追加
O_NONBLOCK 非阻塞模式
O_SYNC 等待写完成(数据和属性)
O_DSYNC 等待写完成(仅数据)
O_RSYNC 同步读、写

三个访问方式标志(O_RDONLY、O_WRONLY 以及O_RDWR)并不各占一位,这三个标志的值分别为 0、1 和 2。因此需要必须使用屏蔽字O_ACCMODE 获取访问模式位,然后将结果与这三种值中任一种做比较。

(5)F_SETFL

将文件状态标志设置为第三个参数的值(取为整 型 值) 可 以 更 改 的 几 个 标 志 是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC 和O_RSYNC。

例子:

下面程序的第一个参数指定文件描述符,并对于该描述符打印其所选择的文件状态标志说明。

#include 
#include
#include
intmain(int argc, char *argv[]){ int val; if (argc != 2) { printf("usage: a.out
"); exit(-1); } if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) { printf("fcntl error for fd %d", atoi(argv[1])); exit(-1); } switch (val & O_ACCMODE) { case O_RDONLY: printf("read only"); break; case O_WRONLY: printf("write only"); break; case O_RDWR: printf("read write"); break; default: err_dump("unknown access mode"); break; } if (val & O_APPEND) { printf(", append"); } putchar('\n'); exit(0);}

编译该程序,生成 flprinter,然后运行该文件,

lienhua34:examples$ ./flprinter 0 < /dev/ttyread onlylienhua34:examples$ ./flprinter 1 > temp.foolienhua34:examples$ cat temp.foowrite onlylienhua34:examples$ ./flprinter 2 2>>temp.foowrite only, appendlienhua34:examples$ ./flprinter 5 5<>temp.fooread write

(done)

转载地址:http://lcsja.baihongyu.com/

你可能感兴趣的文章
ExtJs之Ext.form.field.TimePicker DatePicker组合框
查看>>
移动前端开发基础与优化
查看>>
李洪强iOS开发之最全App上架流程
查看>>
《如何成为乒乓球高手》学习笔记
查看>>
Animator组件关闭再打开后参数丢失问题
查看>>
MyBatis的getStatement()方法解析
查看>>
form表单中的带有name的标签直接转JSON
查看>>
Struts2之Action
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
object pool
查看>>
Numpy.random中shuffle与permutation的区别(转)
查看>>
Spring Cloud Config 服务端与 客户端之间的关系
查看>>
Lemur(狐猴)一个用于自然语言模型和信息检索研究的系统
查看>>
[iBoard 电子学堂][第〇卷 电子基础 ]第三篇 单片微控制器、微处理器
查看>>
完成端口IO模型
查看>>
SQL FOR XML
查看>>
hdu 3068 最长回文(manachar求最长回文子串)
查看>>
9年经验,总结SEO职业瓶颈
查看>>
【转】李开复:现代企业需要的7种人才
查看>>