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 <stdlih.h>
#include <stdio.h>
#include <fcntl.h>
int
main(int argc, char *argv[])
{
int val;
if (argc != ) {
printf("usage: a.out <descriptor#>");
exit(-);
}
if ((val = fcntl(atoi(argv[]), F_GETFL, )) < ) {
printf("fcntl error for fd %d", atoi(argv[]));
exit(-);
}
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();
}

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

lienhua34:examples$ ./flprinter  < /dev/tty
read only
lienhua34:examples$ ./flprinter > temp.foo
lienhua34:examples$ cat temp.foo
write only
lienhua34:examples$ ./flprinter >>temp.foo
write only, append
lienhua34:examples$ ./flprinter <>temp.foo
read write

(done)

UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质的更多相关文章

  1. UNIX环境编程学习笔记(20)——进程管理之exec 函数族

    lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...

  2. UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接

    lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...

  3. UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

    lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...

  4. UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...

  5. UNIX环境编程学习笔记(13)——文件I/O之标准I/O流

    lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...

  6. UNIX环境编程学习笔记(12)——文件I/O之目录操作

    lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...

  7. UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

    lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位  st_mod ...

  8. UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制

    lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...

  9. UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符

    lienhua342014-08-23 UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符. #include <unistd.h> int dup(int fi ...

随机推荐

  1. 1. 感知机原理(Perceptron)

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  2. web开发经验

    图片显示不全 网站进行了迁移,更换了新框架,结果出现了图片显示不全的问题,后来发现是nginx权限问题 curl 无报错,无返回 有可能是url错误,而无服务器对错误的url返回空,没返回错误

  3. C语言 · 征税程序

    算法提高 征税程序   时间限制:1.0s   内存限制:512.0MB      问题描述 税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程 ...

  4. [openssl]openssl特定版本安装

    卸载旧版本 OpenSSL1. apt-get purge openssl2. rm -rf /etc/ssl #删除配置文件编译与安装 OpenSSLprefix 是安装目录,openssldir ...

  5. C#中[] 、List、Array、ArrayList等数据结构的差异简述

    [] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList 是针对任意类型.任意长度的. Array 和 ArrayLis ...

  6. 【进阶修炼】——改善C#程序质量(2)

    16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array ...

  7. oracle快速创建可用用户

    执行语句 create user utaptest identified by utaptest; create tablespace utaptestspace datafile 'd:\data. ...

  8. android开发(34) 自定义 listView的分割线( 使用xml drawable画多条线)

    我遇到这样一个场景,我需要自定义 listView的分割线,而这个分割线是由两条线组成的,在使用xml drawable时遇到了困难. 注释:画两条线是为了实现 凹陷的效果,在绘图中一条暗线紧跟着一条 ...

  9. 初步认识 LESS,我要开始学习LESS啦!

    LESS 是一个流行的样式表语言,它提供了 CSS3 也未曾实现的多种功能,让您编写 CSS 更加方便,更加直观.LESS 已经被广泛使用在多种框架中 ( 例如:BootStrap).本文将介绍 LE ...

  10. About darwin OS

    Darwin 是一种Unix-like操作系统,整合数种的技术,包含开 Darwin LOGO 放原始码的XNU核心,一种以微核心为基础的核心架构来实作Machkernel.操作系统的服务和userl ...