博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux-open与close函数

Posted on 2023-03-14 07:03  乔55  阅读(69)  评论(0编辑  收藏  举报

open函数

// opne函数详解

int open(const char *pathname, int flags);  
int open(const char *pathname, int flags, mode_t mode); 
  • 功能: 既能打开一个已存在的文件,也能创建并打开一个新的文件
  • 返回值:
    • 成功则返回一个最小且未被占用的文件描述符,用于后续函数调用中指代该文件
    • 若发生错误,则返回-1,并将errno置为相应的错误标志
  • pathname参数:要打开的文件由pathname来标识,若pathname是一个符号链接,会对其进行解引用
  • flags必选项:它是位掩码,用于指定文件的访问方式,从以下3个选项3选1作为flags参数,且只能选一个
    • O_RDONLY, // 只读方式打开文件
    • O_WRONLY, // 只写方式打开文件
    • O_RDWR. // 读写方式打开文件
  • flag可选项:可选择0或多个与必选项按位或起来作为falgs参数
    • O_APPEND:表示追加
    • O_CREAT:若文件不存在则创建之。使用此选项必须提供第3个参数mode,表示该文件的访问权限
    • O_EXCL:若同时指定了O_CREAT,并且文件已经存在,则出错,返回
    • O_TURNC:若文件已经存在,将其长度截断了0字节
    • O_NONBLOCK:对于设备文件,以O_NONBLOCK方式打开可以做非阻塞IO
  • mode参数:它也是位掩码参数。mode指定了文件访问权限,SUSv3规定,其数据类型为mode_t
    • mode参数可以指定为数字,通常为8进制,更为可取的做法是对0个或多个位掩码常量进行逻辑或操作
    • 若open未指定O_CREAT参数,则省略mode参数。
    • 能影响新建文件权限的2个因素
      • mode参数影响
      • 进程的umask值
      • 可能存在的父父目录的默认访问控制列表的影响

close

int close(int fd);
// 成功返回0,失败返回-1并设置errno值
// 当一个进程终止,内核对该进程所有尚未关闭的fd调用close将其关闭
// 对于一个长时间运行的程序,打开的文件描述符一定要记得关闭

open使用举例

只读方式打开一个文件

fd = open("a.txt", O_RDONLY);  
// a.txt必须存在,若不存在,则打开失败

有则打开,无则创建

fd = open("a.txt", O_RDWR | O_CREAT, 0666);
// 以读写方式打开,若a.txt不存在,则创建之,被创建的文件权限为mode ~& umask

判断个文件是否存在

fd = open("b.txt", O_RDONLY | O_CREAT | O_EXCL, 0666);
// 若文件已经存在,则打开失败
// O_EXCL必须与O_CREAT一块使用才有效。

截断文件

fd = open("b.txt", O_RDONLY | O_TRUNC, 0666); 
// 截断一个已经存在的文件a.txt,若文件不存在,则open失败

fd = open("a.txt", O_RDWR |O_CREAT | O_TRUNC, 0777);
// 截断文件,若文件不存在,则新建之
// 但此处“截断”无意义,因为若新建文件必然是截断的,不如把截断标志删掉。直接创建