嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

    由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读。函数原型如下:

#include

#include

 

int fcntl(int fd, int cmd, ... /* arg */ );

    fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令cmdfcntl()的返回值与控制命令有关。如果出错,所有命令都返回-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()函数成功后,文件描述符会自动关闭

   CF_GETFD

    获取文件描述符标识,arg可忽略。如果获取的文件描述符标识与文件描述符标识FD_CLOEXEC相位与等于0文件保持交叉式访问exec(),否则文件关闭。

  D、F_SETFD

    设置文件描述符标识的值为arg

    设置close-on-exec标志,该标志以参数argFD_CLOEXEC位决定,很多现存的涉及文件描述符标志的程序并不使用常数 FD_CLOEXEC,而是将此标志设置为0(系统默认,在exec时不关闭)1(exec时关闭)

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

EF_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标识。

   GF_GETOWN

    获取当前在文件描述 fd上接收到SIGIO SIGURG事件信号的进程ID或进程组,arg忽略。

H、F_SETOWN

    设置在文件描述fd上接收SIGIO 或 SIGURG事件信号的进程ID或进程组ID,值为arg

   IF_GETSIG

    获取输入输出可进行的信号,返回0则表示SIGIO已经发送,arg忽略。

   JF_SETSIG

    设置输入输出可进行的信号,值为arg,如果arg0则 默认发送SIGIO信号。

   KF_GETLK

    获取文件锁信息,argstruct flock *lock,是一个指向文件锁结构的指针。

  L、F_SETLK

    设置文件锁

  MF_GETLEASE

    获取租约,arg忽略

  NF_SETLEASE

    根据arg的值,设置、删除文件租约。

 

    一般来说,在获取状态信息的情况下,arg参数忽略,设置修改信息的时候arg为参数值。

    fcntl函数实在过于博大精深,本文仅对man手册进行了解读,具体的应用实例将在后续献上。