说明:
本文主要内容是从网上摘录的,并加上模板案例来验证说明。
参考以下文章,谢谢作者的分享:
【Linux】open函数的参数和作用_open参数-CSDN博客
目录:
一、open函数的使用意义
open函数属于Linux中的系统IO,open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。
二、open函数使用时需要添加的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
三、 open函数的原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
四、返回值说明
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。要注意的是,有以下几点:
1.文件权限由open的mode参数和当前进程的umask掩码共同决定。
2.第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略
4、使用模板案例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int fd;
//以读写的方式创建新文件
fd=open("myhello",O_RDWR | O_CREAT,0777);
//以读写的方式创建新文件,并判断是否存在
//fd=open("myhello",O_RDWR | O_CREAT | O_EXCL,0777);
//以读写的方式创建新文件,若文件存在则进行截断(清空文件内容)
//fd = open("myhello", O_RDWR | O_CREAT | O_TRUNC, 0777);
if (fd < 0)
{
printf("can not open file %s\n", argv[1]);
printf("errno = %d\n", errno);
printf("err: %s\n", strerror(errno));
perror("open");
}
else
{
printf("fd = %d\n", fd);
}
close(fd);
return 0;
}