【Linux】open函数的参数和作用

一、open函数用来干什么

open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。

二、open函数的定义和参数

我们首先来看下open函数在Linux下的定义

#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);

头文件

如上所示,我们在使用open函数时候需要添加的头文件是

#include <sys/types.h>//这里提供类型pid_t和size_t的定义
#include <sys/stat.h>
#include <fcntl.h>

返回值

open函数的返回值如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1。

参数含义:

1、pathname:

在open函数中第一个参数pathname是指向想要打开的文件路径名,或者文件名。我们需要注意的是,这个路径名是绝对路径名。文件名则是在当前路径下的。

2、flags:

flags参数表示打开文件所采用的操作,我们需要注意的是:必须指定以下三个常量的一种,且只允许指定一个

  • O_RDONLY:只读模式
  • O_WRONLY:只写模式
  • O_RDWR:可读可写

以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。

  • O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
  • O_CREAT 表示如果指定文件不存在,则创建这个文件
  • O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
  • O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
  • O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
  • O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)

以下三个常量同样是选用的,它们用于同步输入输出

  • O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
  • O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
  • O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
3、mode:

mode参数表示设置文件访问权限的初始值,和用户掩码umask有关,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,有以下几点

  • 文件权限由open的mode参数和当前进程的umask掩码共同决定。
  • 第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略

三、open函数与fopen函数区别

从来源来分,这两者很好区分:

open函数是Unix下系统调用函数,操作成功返回的是文件描述符,操作失败返回的是-1,

fopen是ANSIC标准中C语言库函数,所以在不同的系统中调用不同的内核的API,返回的是一个指向文件结构的指针。

同时open函数没有缓冲,fopen函数有缓冲,open函数一般和write配合使用,fopen函数一般和fwrite配合使用。

  • 40
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Linux中,`open()` 函数是用来打开一个文件的函数,它的一般形式如下: ```c #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); ``` - `pathname`:要打开的文件路径名。 - `flags`:打开文件的模式标志。可以使用多个标志,通过位运算进行组合。常用的标志有: - `O_RDONLY`:以只读方式打开文件。 - `O_WRONLY`:以只写方式打开文件。 - `O_RDWR`:以读写方式打开文件。 - `O_CREAT`:如果文件不存在则创建文件。 - `O_EXCL`:与 `O_CREAT` 同时使用,如果文件已经存在,则返回错误。 - `O_APPEND`:在文件末尾追加数据。 - 等等,还有其他的标志可用。 - `mode`:当使用 `O_CREAT` 标志时,需要指定文件的权限。可以使用八进制表示的权限值,比如 `0644`。 函数返回一个非负整数的文件描述符(file descriptor),表示成功打开的文件。如果出现错误,返回值为-1,并设置 `errno` 变量来指示错误类型。 下面是一个简单的例子,演示了如何使用 `open()` 函数打开一个文件: ```c #include <fcntl.h> #include <stdio.h> int main() { int fd = open("file.txt", O_RDWR | O_CREAT, 0644); if (fd == -1) { perror("open"); return 1; } // 打开成功,可以进行读写操作 close(fd); // 关闭文件 return 0; } ``` 上述代码中,我们使用 `open()` 函数打开一个名为 "file.txt" 的文件,并以读写方式打开。如果文件不存在,则会创建该文件。如果打开失败,会通过 `perror()` 函数输出错误信息。最后,我们使用 `close()` 函数关闭文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值