Linux open fopen fdopen
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
以下三个常量中必选一个:
O_RDONLY //只读模式
O_WRONLY //只写模式
O_RDWR //读写模式
以下常量选用:
O_APPEND //每次写操作都写入文件的末尾
O_CREAT //如果指定文件不存在,则创建这个文件
O_EXCL //如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC //如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY //如果路径名指向终端设备,不要把这个设备用作控制终端
O_NONBLOCK //如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O
以下三个常量同样是选用的,它们用于同步输入输出:
O_DSYNC //等待物理I/O结束后再write。在不影响读取新写入的数据的前提下,不等待文件属性更新
O_RSYNC //read等待所有写入同一区域的写操作完成后再进行
O_SYNC //等待物理I/O结束后再write,包括更新文件属性的I/O
open返回的文件描述符一定是最小的未被使用的描述符
参数mode 组合
S_IRWXU //00700权限,代表该文件所有者具有可读、可写及可执行的权限
S_IRUSR或S_IREAD //00400权限,代表该文件所有者具有可读取的权限
S_IWUSR或S_IWRITE //00200权限,代表该文件所有者具有可写入的权限
S_IXUSR或S_IEXEC //00100权限,代表该文件所有者具有可执行的权限
S_IRWXG //00070权限,代表该文件用户组具有可读、可写及可执行的权限
S_IRGRP //00040权限,代表该文件用户组具有可读的权限
S_IWGRP //00020权限,代表该文件用户组具有可写入的权限
S_IXGRP //00010权限,代表该文件用户组具有可执行的权限
S_IRWXO //00007权限,代表其他用户具有可读、可写及可执行的权限
S_IROTH //00004权限,代表其他用户具有可读的权限
S_IWOTH //00002权限,代表其他用户具有可写入的权限
S_IXOTH //00001权限,代表其他用户具有可执行的权限
creat(const char* pathname, mode_t mode);
open和creat区别:
creat()创建文件,总会运行成功
creat()创建已存在的文件,并不会更改原文件的属性
O_APPEND
含义是在每次写之前,都将标志位移动到文件的末端
int fd = open("test.txt", RDWR | O_APPEND);
lseek(fd, 10, SEEK_SET);
这里lseek是没有用的
转换
FILE *fp = fopen("test.txt", "r");
int fd = fileno(fp);
寻找文件流使用的是哪个底层文件描述符。进行底层访问操作(比如想对他调用fstat)
FILE *fdopen(int fd, const char *mode);
根据文件描述符创建文件流。为一个已经打开的文件描述符提供一个stdio缓冲区
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!