open函数原型
int open(const char *pathname, int flag);
int open(const char *pathname, int flag, mode_t mode);
需要包含的头文件sys/types.h、sys/stat.h、fcntl.h。
open()函数打开pathname指定的文件,当函数成功时,返回一个整型的文件描述符。这个函数正常情况下会返回一个文件描述符的值,在出错的时候会返回-1.
pathname参数
打开文件的时候需要指定打开的文件路径,这个参数由filename指定。pathname所指的为一个字符串变量,这个变量的长度在不同的系统其最大长度有区别,通常情况下为1024个字节。当所给的路径长度大于这个数值的时候,系统会对字符串进行截断,仅选择最前面的字节进行操作。
flag参数
用于设置文件打开后允许的操作方式,可以为只读、只写或读写。分别用O_RDONLY(只读)、O_WRONLY(只写)和O_RDWR(读写)表示。在打开文件的时候必须指定上述的三种模式之一。三个参数中O_RDONLY通常定义为0,O_WRONLY通常定义为1,O_RDWR定义为2.
参数flag除了上述三个选项之外,还有一些可选的参数。
- O_APPEND选项:使每次对文件进行写操作都追加到文件的尾端。
- O_CREAT选项:如果文件不存在则创建它,当使用此选项时,第三个参数mode需要同时设定,用来说明新文件的权限。
- O_EXCL:查看文件是否存在。如果同时指定了O_CREAT,而文件已经存在,会返回错误。用这种方法可以安全打开一个文件。
- O_TRUNC:将文件长度截断为0.如果此文件存在,并且文件成功打开,则会将其长度截断为0。例如:
open(pathname,O_RDWR|O_CREAT|O_TRUNC,mode);
通常使用O_TRUNC选项对需要清空的文件进行归零操作。O_NONBLOCK打开文件为非阻塞方式,如果不指定此项,默认的打开方式为阻塞方式,即对文件的读写操作需要等待操作的返回状态。
mode参数
其中,参数mode用于表示打开文件的权限,mode的使用必须结合flag的O_CREAT使用,否则是无效的。它们的值在以下列出。
选项 | 值 | 含义 |
S_IRWXU | 00700 | 用户(文件所有者)有读写和执行的权限 |
S_IRUSR | 00400 | 用户对文件有读权限 |
S_IWUSR | 00200 | 用户对文件有写权限 |
S_IXUSR | 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 | 其他用户对文件有执行权限 |
/*open-01.c打开文件的例子*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd = -1; /*文件描述符声明*/
char filename[] = "test.txt"; /*打开的文件名*/
fd = open(filename,O_RDWR); /*打开文件为可读写方式*/
if(-1 == fd){ /*打开失败*/
printf("Open file %s failure!, fd:%d\n",filename,fd);
} else { /*打开成功*/
printf("Open file %s success,fd:%d\n",filename,fd);
}
return 0;
}
0、1、2文件描述符分配给了系统,表示标准输入(描述符0)、标准输出(描述符1)和标准错误(描述符2)。
O_CREAT可以创建文件,与O_EXCL结合使用可以编写容错的程序,例如:
/*文件open-03.c,O_CREAT和O_EXCL的使用*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd = -1;
char filename[] = "test.txt";
/*打开文件,如果文件不存在,则报错*/
fd = open(filename,O_RDWR|O_CREAT|O_EXCL,S_IRWXU);
if(-1 == fd){ /*文件已经存在*/
printf("File %s exist!,reopen it",filename);
fd = open(filename,O_RDWR); /*重新打开*/
printf("fd:%d\n",fd);
} else { /*文件不存在,创建并打开*/
printf("Open file %s success,fd:%d\n",filename,fd);
}
return 0;
}