Linux fcntl 函数全解

本文详细介绍了Linux系统中的fcntl函数,包括cmd的可选值如F_DUPFD、F_GETFD、F_SETFL等,以及文件锁F_SETLK、F_SETLKW、F_GETLK的使用。内容涵盖了文件描述符复制、文件状态标志的修改和文件锁的管理,是理解Linux系统编程的重要参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数声明

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );
//当函数执行失败时返回-1
1.1 cmd可选值
  1. Duplicating a file descriptor:(复制文件描述符)
    • F_DUPFD
    • F_DUPFD_CLOEXEC
  2. File descriptor flags:(文件描述符标志)
    • F_GETFD
    • F_SETFD
  3. File status flags(文件状态标志)
    • F_GETFL
    • F_SETFL

可以通过F_SETTFL修改的只有O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, O_NONBLOCK、O_DSYNC 、O_SYNC最后这两个可能会修改失败(从https://man7.org/linux/man-pages/man2/fcntl.2.html中得知,具体原因暂未了解)。

注意:

1.文件状态标志并不包括O_CREAT(还有其他三个在下面列出来)。这只是open,打开不存在的文件时,告诉open应该创建该文件。(O_CREAT是为了避免两次系统调用,open和creat非原子性造成的一些问题,而产生)

O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC

2.而且并不是所有的文件状态标志都可以改变,例如

O_RDONLY, O_WRONLY, O_RDWR这三个就不可以修改

(参考自 https://man7.org/linux/man-pages/man2/fcntl.2.html )
Set the file status flags to the value specified by arg. File
access mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation
flags (i.e., O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are
ignored. On Linux, this command can change only the O_APPEND,
O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK flags. It is not
possible to change the O_DSYNC and O_SYNC flags; see BUGS,
below
.

  1. Advisory record locking(文件锁相关)

    • F_SETLK
    • F_SETLKW
    • F_GETLK
  2. Managing signals (信号管理)

    • F_GETOWN
    • F_SETOWN

F_GETOWN, F_SETOWN, F_GETOWN_EX, F_SETOWN_EX, F_GETSIG and F_SETSIG
are used to manage I/O availability signals:

二、实例

2.1 F_DUPFD / F_DUP_CLOEXEC(Duplicating a file descriptor)
fcntl(fd, F_DUPFD, newfd);

这里只简单演示使用,F_DUPFD和F_DUP_CLOEXEC的区别在于新产生的文件描述符,是否有CLOEXEC描述符标志。(关于CLOEXEC的作用,可以看我的这篇文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值