3.14 文件I/O_fcntl函数

来源:互联网 发布:php foreach 延迟执行 编辑:程序博客网 时间:2024/05/16 06:23

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

  • #include <fcntl.h>
  • int fcntl(it filedes, int cmd, .../* int arg */);

返回值:成功则依赖于cmd,出错返回-1

    fcntl函数有5中功能:

  • 复制一个现有的描述符(cmd=F_DUPFD)。
  • 获得/设置文件描述符标记(cmd=FD_GETFD或F_SETFD)。
  • 获得/设置文件状态标志(cmd=FD_GETFL或F_SETFL)。
  • 获得/设置异步I/O所有权(cmd=FD_GETOWN或F_SETOWN)。
  • 获得/设置记录锁(cmd=FD_GETLK、F_SETLK或F_SETLKW)。
  • F_DUPFD: 复制文件描述符filedes。新文件描述符作为函数值返回。它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值。新描述符与filedes共享同一个文件表项。但是,新描述符有它自己的一套文件描述符标志,其FD_CLOEXEC文件描述符标志被清除。
  • F_SETFD: 对于filedes设置文件描述符标志。新标志按第三个参数设置。
  • F_GETFL: 三个访问方式标志(O_RDONLY、O_WRONLY以及O_RDWR)并不各占1位。因此首先必须用屏蔽字O_ACCMODE取得访问模式位,然后将结果与这三种值中的任一种作比较。
  • F_GETOWN: 取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。
  • F_SETOWN: 设置接收SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程组ID。

    下列四个命令有特定返回值:F_DUPFD、F_GETFD、F_GETFL以及F_GETOWN。第一个返回新的文件描述符,接下来的两个返回相应标志,最后一个返回一个正的进程ID或负的进程组ID。

    在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现有的标志值,然后根据需要修改它,最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。

    将fsync和fdatasync函数与O_SYNC标志相比较,fsync和fdatasync在我们需要时更新文件内容,O_SYNC标志则在我们每次写至文件时更新文件内容。