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.
打开文件的时候需要指定打开的文件路径,这个参数由filename指定。pathname所指的为一个字符串变量,这个变量的长度在不同的系统其最大长度有区别,通常情况下为1024个字节。当所给的路径长度大于这个数值的时候,系统会对字符串进行截断,仅选择最前面的字节进行操作。
用于设置文件打开后允许的操作方式,可以为只读、只写或读写。分别用O_RDONLY(只读)、O_WRONLY(只写)和O_RDWR(读写)表示。在打开文件的时候必须指定上述的三种模式之一。三个参数中O_RDONLY通常定义为0,O_WRONLY通常定义为1,O_RDWR定义为2.
参数flag除了上述三个选项之外,还有一些可选的参数。
open(pathname,O_RDWR|O_CREAT|O_TRUNC,mode);
通常使用O_TRUNC选项对需要清空的文件进行归零操作。O_NONBLOCK打开文件为非阻塞方式,如果不指定此项,默认的打开方式为阻塞方式,即对文件的读写操作需要等待操作的返回状态。
其中,参数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
#include
#include
#include
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
#include
#include
#include
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;
}