由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读。函数原型如下:
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令cmd。fcntl()的返回值与控制命令有关。如果出错,所有命令都返回-1。
常见控制命令如下:
A、F_DUPFD
找一个大于等于arg的最小可用的文件描述符作为fd的副本,该用法与dup2函数的区别在于dup2函数可以精确地指定文件描述符。成功则返回新的文件描述符。
fcntl(oldfd, F_DUPFD, 0);//等价于dup(oldfd);
close(oldfd);
fcntl(oldfd, F_DUPFD, newfd);//新返回的文件描述符大于等于newfd
//等价于dup2(oldfd, newfd);//新返回的文件描述符等于newfd
B、F_DUPFD_CLOEXEC
与F_DUPFD相同,但是增加了设置close-on-exec标识。即当调用exec()函数成功后,文件描述符会自动关闭。
C、F_GETFD
获取文件描述符标识,arg可忽略。如果获取的文件描述符标识与文件描述符标识FD_CLOEXEC相位与等于0,文件保持交叉式访问exec(),否则文件关闭。
D、F_SETFD
设置文件描述符标识的值为arg
设置close-on-exec标志,该标志以参数arg的FD_CLOEXEC位决定,很多现存的涉及文件描述符标志的程序并不使用常数 FD_CLOEXEC,而是将此标志设置为0(系统默认,在exec时不关闭)或1(在exec时关闭)。
在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现在的标志值,然后按照希望修改它,最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。
E、F_GETFL
获取文件状态标识,arg忽略
F、F_SETFL
设置文件状态标识的值为arg,文件访问模式(O_RDONLY,O_WRONLY, O_RDWR)和文件创建标识(O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC)被忽略,只能改变O_APPEND, O_ASYNC, O_DIRECT, O_NOAT-IME, 和 O_NONBLOCK标识。
G、F_GETOWN
获取当前在文件描述符 fd上接收到SIGIO 或 SIGURG事件信号的进程ID或进程组,arg忽略。
H、F_SETOWN
设置在文件描述符fd上接收SIGIO 或 SIGURG事件信号的进程ID或进程组ID,值为arg。
I、F_GETSIG
获取输入输出可进行的信号,返回0则表示SIGIO已经发送,arg忽略。
J、F_SETSIG
设置输入输出可进行的信号,值为arg,如果arg为0则 默认发送SIGIO信号。
K、F_GETLK
获取文件锁信息,arg为struct flock *lock,是一个指向文件锁结构的指针。
L、F_SETLK
设置文件锁
M、 F_GETLEASE
获取租约,arg忽略
N、F_SETLEASE
根据arg的值,设置、删除文件租约。
一般来说,在获取状态信息的情况下,arg参数忽略,设置修改信息的时候arg为参数值。
fcntl函数实在过于博大精深,本文仅对man手册进行了解读,具体的应用实例将在后续献上。
本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!
嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl
原文地址:http://9291927.blog.51cto.com/9281927/1796547