open 建立了一条到文件或设备的访问路径。如果调用成功,它将返回一个可以被 read、write 和其他系统调用使用的文件描述符。这个文件描述符是唯一的,不会与任何其他运行中的进程共享。在调用失败时,将返回 -1 并设置全局变量 errno 来指明失败的原因。
使用 open 系统调用时,准备打开的文件或设备的名字作为参数 path 传递给函数,oflags 参数用于指定打开文件所采取的动作。oflags 参数是通过命令文件访问模式与其他可选模式相结合的方式来指定的,open 调用必须指定以下文件访问模式之一:
1)O_RDONLY:以只读方式打开;
2)O_WRONLY:以只写方式打开;
3)O_RDWR :以读写方式打开。
另外,还有以下几种可选模式的组合( 用按位或 || 来操作 ):
4)O_APPEND:把写入数据追加在文件的末尾;
5)O_TRUNC:把文件长度设置为零,丢弃已有的内容;
6)O_CREAT:如果需要,就按照参数 mode 中给出的访问模式创建文件;
7)O_EXCL:与 O_CREAT 一起使用,确保调用者创建出文件。使用这个模式可以防止两个程序同时创建同一个文件,如果文件已经存在,open 调用将失败。
当使用 O_CREAT 标志的 open 调用来创建文件时,需要使用有 3 个参数格式的 open 调用。其中,第三个参数 mode 是几个标志按位或后得到的,这些标志在头文件 sys/stat.h 中定义,如下:
标志 说明 标志 说明 标志 说明S_IRUSR 文件属主可读 S_IRGRP 文件所在组可读 S_IROTH 其他用户可读
S_IWUSR 文件属主可写 S_IWGRP 文件所在组可写 S_IWOTH 其他用户可写
S_IXUSR 文件属主可执行 S_IWOTH 文件所在组可执行 S_IXOTH 其他用户可执行
用一个例子说明一下:
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
int main()
{
open("file",O_CREAT,S_IRUSR | S_IWGRP);
exit(0);
}
执行这段代码将在当前目录下创建一个名为 file 的文件,该文件对文件属主可读,对文件所在组可写,用 ls -l 命令查看如下:
可以看到有一个名为 file 的文件,该文件就是使用 open 系统调用创建的,文件的权限为文件属主可读,文件所在组可写。
2.4 close 系统调用
系统调用 close 可以用来终止文件描述符 fildes 与其对应文件之间的关联。当 close 系统调用成功时,返回 0,文件描述符被释放并能够重新使用;调用出错,则返回 -1。
#include <unistd.h>
int close(int fildes);
2.5 ioctl 系统调用
系统调用 ioctl 提供了一个用于控制设备及其描述符行为和配置底层服务的接口。终端、文件描述符、套接字甚至磁带机都可以有为它们定义的 ioctl。
#include <unistd.h>
int ioctl(int fildes,int cmd,...);
ioctl 对描述符 fildes 引用的对象执行 cmd 参数中给出的操作。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx