open函数用来打开一个文件,建立一个文件描述符到文件路径的映射,为后续的各种文件操作建立一个文件标识。
open函数原型如下:
#include <fcntl.h>
int open(const char *pathname, int oflag,...);
返回值:如果成功则返回文件描述符,如果出错则返回-1。
参数:
1、pathname 是要打开或创建的文件的路径或者名字。可以是绝对路径,也可以是相对路径。
2、oflag 是操作选项。是一个整数,每个位代表一个操作选项。通过一些常量的或运算构成综合性的操作参数。
3、... 说明该参数是可选参数,该参数mode_t类型数据。称为文件创建模式字,它决定要的文件的一些权限。参考umask函数,这里暂且不管这个参数。
三个常量决定文件的读写模式,可以选择其中一个,不能同时选。这三个是O_RDONLY、O_WRONLY、O_RDWR。定义在头文件<fcntl.h>或者<bits/fcntl.h>中。
#define O_RDONLY 00 /*只读方式打开*/
#define O_WRONLY 01 /*只写方式打开*/
#define O_RDWR 02 /*读写方式打开*/
也就是说, oflag参数的低2位( bit0和 bit1)表示文件读写模式, bit0为1表示文件只能用于写操作, bit1为1表示可读也可写, bit0和 bit1都为0表示只读。
实例 x.3.3.1
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
char pathname[] = "/tmp/myfile";
int fileid;
fileid = open(pathname, O_RDWR | O_CREAT);
/* O_RDWR表示读写模式打开*/
/*O_CREAT表示如果文件不存在则创建它*/
if (fileid < 0 ) { /*fileid 为负数则说明open失败*/
printf("open error for %s\n", pathname);
return 1;
} else {/*fileid为非负则说明open成功*/
printf("fileid is %d\n", fileid);
close(fileid);
}
return 0;
}
编译与运行:
[root@localhost unixc]# cc x.3.3.1.c
[root@localhost unixc]# ./a.out
fileid is 3
[root@localhost unixc]#
其他常量定义如下:
/* 若此文件不存在则创建它 */
#define O_CREAT 0100
/* 若同时指定了O_CREAT且文件已经存在则出错 */
#define O_EXCL 0200
/* 若pathname为终端设备,则不将该设备分配作为此进程的控制终端。 */
#define O_NOCTTY 0400
/* 若此文件存在,且文件可写,则将其截短为0,也就是清除文件所有已存内容 */
#define O_TRUNC 01000
/* 每次写时都追加到文件的尾端 */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 04010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000
文件标识符0、1、2分别代表标准输入、标准输出和标准错误输出,分别用常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO代替。
OPEN_MAX表示每个进程最大可以打开的文件数量。