open函数:
打开或创建一个文件
#include <fcntl.h>
int open(const char *pathname,int oflag, mode_t mode);
返回:若成功为文件描述符,若出错为-1
第一个参数pathname是要打开或创建的文件名称。
第二个参数oflag可用来说明此函数的多个选择项,用下列一个或多个常数进行或运算构成oflag参数(这些常数定义在<fcntl.h>头文件中):
O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR写打开
在上面三个常量中必须指定一个·。
下列常量则是可以选择的:
O_APPEND每次写时都追加到文件尾部
O_CREAT若文件不存在,则创建它。使用此选项时,需要在第三个参数mode,用于指定该文件的访问权限位。
O_EXCL如果同时指定了O_CREAT,而文件已将存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件,这 使测试和创建两者成为一个原子操作。
O_TRUNC如果文件存在,而且为只写或读写成功打开,则将其长度截短为0.
O_NOCTTY如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
O_NONBLOCK如果pathname指的是一个FIFO。一个块特殊文件或一个字符串特殊文件,则此选项为文本的本次打开操作和后续的I/O操作设置非阻塞。
第三个参数mode对于open函数而言,仅当创建新文件时才使用第三个参数。(文件权限chmod 777 filename)
由于open函数返回的文件描述符一定是最小的未用描述符的数值,所以打开文件成功的描述符一般是从3开始。
(因为0、1、2被代替换成符号常数STDIN_FILEND、STDOUT_FILENO和STDERR_FILENO)
creat函数:
也可用creat创建一个新文件
#include <fcntl.h>
int creat(const char *pathname,mode_t mode);
返回值:若成功则返回为只写打开的文件描述符,若出错则返回-1.
注意,此函数等效于:
open(pathname,O_WRONLY | O_CREAT | O_TRUNC ,mode);
creat的一个不足之处是它们以只写方式创建文件。在提供open的新版本之前,如果要创建一个临时文件,并要先写该文件,然后又读该文件,则必须先调用creat、close,然后再调用open。现在则可用下列方式调用open:
open(pathname,O_RDWR | O_CREAT | O_TRUNC, mode);
close函数:
也可用close函数关闭一个文件
#include <unistd.h>
int close(int filedes);
返回值:若成功则返回0,若出错则返回-1.
关闭一个文件时还会释放该进程加在该文件上的记录锁。
当一个进程终止时,内核自动关闭它所有打开的文件。很多程序都利用了这一功能而不显示地用close关闭打开文件。
简单例子:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int fd = -1;
fd = open("hello01.c",O_CREAT|O_TRUNC|O_WRONLY,00600);
if(fd<0)
{
perror("open:");
exit(1);
}
else
printf("open file:hello01.c %d\n",fd);
if(close(fd)<0)
{
perror("close:");
exit(1);
}
else
printf("Close hello01.c\n");
exit(0);
}
运行结果: