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除了上述三个选项之外,还有一些可选的参数。

  1. O_APPEND选项:使每次对文件进行写操作都追加到文件的尾端。
  2. O_CREAT选项:如果文件不存在则创建它,当使用此选项时,第三个参数mode需要同时设定,用来说明新文件的权限。
  3. O_EXCL:查看文件是否存在。如果同时指定了O_CREAT,而文件已经存在,会返回错误。用这种方法可以安全打开一个文件。
  4. 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;
}