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


    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 != 2) {
            printf("usage: a.out <descriptor#>");
            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('
    ');
        exit(0);
    }

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

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

    (done)

  • 相关阅读:
    centos6.5 源码安装 mysql
    centOS系统安装MySQL教程
    CENTOS下搭建SVN服务器
    定位记录,删除后定位到下一条记录上
    Delphi Edit输入+号(加号),不允许显示输入符号,清空Edit,显示事件
    [经常用此练习即可] SQL2000行转列三种方式解答,侧重于第二种方式,第一种需用临时表,第三种方式适合固定方式写入都正确
    Delphi与SQL模糊like通配符查询(转载)
    四舍五入可以用这种形式,保留2位小数!
    APP开发工具对比!!
    FastReport 使用技巧篇
  • 原文地址:https://www.cnblogs.com/lienhua34/p/3945919.html
Copyright © 2020-2023  润新知