#include <fcntl.h>
int fcntl(int fd,int cmd,.../*int arg */)
fcntl 的第三个参数是一个整数 或者 一个指向结构体的指针(用于记录锁)
fcntl函数有5中功能:
1 复制一个已有的操作符(cmd=F_DUPFD或F_DUPFD_CLOEXEC)
F_DUPFD 复制文件描述符fd。新文件的描述符作为函数返回值。它是尚未打开的新描述符与fd共享同一文件表项。但是,新描述符有它自己的一套文件描述符标志,其FD_CLOEXEC 文件描述符的标志被清除。指标是该描述符在exec时保持有效。
F_DUPFD_CLOEXEC 复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值,返回新文件描述符。
2 获取/设置文件描述符标志(cmd=F_GETFD或者F_SETFD)
当前只定义了一个文件描述符标志FD_CLOEXEC。现有的与文件描述符有关的程序并不使用常量FD_CLOEXEC,而是将此标志设置为0(系统默认,在exec时不关闭)或1(在exec时关闭)。
3 获取/设置文件状态标志(cmd=F_GETFL或F_SETFL)
文件状态标志
O_RDONLY
O_WRONLY
O_RDWR
O_EXEC 只执行打开
O_SEARCH 只搜索打开目录
O_APPEND 追加xie
O_NONBLOCK 非阻塞模式
O_SYNC 等待写完成(数据和属性)
O_DSYNC 等待写完成(数据)
O_RSYNC 同步读和写
访问模式的5种方式并不各占1位,这5个值互斥,一个文件的访问方式只能取这5个值之一。因此必须用屏蔽字O_ACCMODE去的访问方式位,然后将结果与这5个值的每一个相比较。
4获取/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
获取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。
设置接收SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程组ID。
5获取/设置记录锁(cmd=F_GETLK F_SETLK或F_SETLKW)。