open Linux

本文详细介绍了Linux 4.2.0内核中的open函数,用于打开文件并返回文件描述符。open函数的flags参数包含必备和可选选项,讨论了如何利用文件描述符替换标准输出,并提到了Filename和Pathname的截断问题。此外,文章指出creat函数相当于open的简化版本,用于创建只写文件,但建议直接使用open函数进行更灵活的操作。

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

本文基于Linux 4.2.0内核手册。

open function用于打开一个文件并返回文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);

Return: file descriptor if OK
        -1             on ERROR

flags有三个选项:

flags
O_RDONLY只读
O_WRONLY只写
O_RDWR可读可写

如上三个选项是必备的,如下的常量是可选的:

optional flags
O_APPEND每次write操作在文件尾追加内容
O_CREAT如果文件不存在,创建新文件,该选项需要第三个参数mode,mode指定了新文件的访问权限
O_EXCLO_CREAT也被制定并且文件已经存在了,则会产生错误。该选项用于确保本次调用创建文件。
O_TRUNC仅当文件存在,文件成功打开,并且权限为只写或者读写,会将其长度截断为0
O_NOCTTY如果打开的是终端设备(terminal device),则不会将该设备作为该进程的控制终端(controlling terminal)
O_NONBLOCK or O_NDELAYIf the pathname refers to a FIFO, a block special file, or a character special file,该选项会设置打开的文件和后续的IO操作为无阻塞的模式。O_NDELAY与O_NONBLOCK功能一样,建议新的代码都不要使用O_NDELAY
O_ASYNCEnable signal-driven I/O: generate a signal (SIGIO by default, but this can be changed via fcntl(2)) when input or output becomes possible on this file descriptor. This feature is available only for terminals, pseudoterminals, sockets, and (since Linux 2.6) pipes and FIFOs. See fcntl(2) for further details. See also BUGS, below.
O_DSYNC该选项影响文件的属性,仅仅在文件数据改变并且需要更新这些属性的时候。
O_SYNC每次写入文件的时候都会更新文件的时间
O_CLOEXEC
O_DIRECT
O_DIRECTORY
O_LARGEFILE
O_NOATIME
O_NOFOLLOW
O_PATH
O_TMPFILE

通过open返回的文件描述符,会使用没有使用的最小整数。利用这种特性,你可以关闭某个标准输出-例如标准输出 1,然后打开一个新的文件,那么该文件的描述符就是1。这样就等于在标准输入、输出、错误之上打开了一个新文件。我们有更好的办法在给定的描述符上打开文件,dup2函数具有该功能。

Filename and Pathnamer Trunction

NAME_MAX表明文件名的最大长度,PATH_MAX为路径名的最大长度。Linux中会直接报错,不会进行截断文件名。errno会被设置为ENAMETOOLONG

creat

creat相当于open使用了flags(O_CREAT|O_WRONLY|O_TRUNC),且creat打开的文件是只写的,如果你需要read,则需要先close文件,再用open打开。因此建议直接使用open,而不再使用creat。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值