什么是 UNIX 中的开放 API?
UNIX 中有一组用于操作文件的通用 API。这些 API 之一是开放 API 。 open API 用于创建新文件以及在进程和文件之间建立连接。创建文件后,任何进程都可以调用 open函数,并获得一个文件描述符来引用该文件,其中包含 inode 信息。 open函数的原型如下:
#include
#include
int open(const char *path_name, int access_mode, mode_t permission);
- 如果成功,open函数返回一个表示打开文件描述符的非负整数。
- 如果不成功,open函数返回 -1
函数原型中参数的使用:
第一个参数:path_name
这指定要创建或打开的文件的路径名。这可能是相对路径名或绝对路径名。如果路径名是符号链接,则 open函数将解析链接指向该链接所指向的非符号链接文件。
第二个参数:access_mode
它是一个整数值,指定调用进程如何访问文件。该值应该是下面描述的在
Access mode flag | Use |
---|---|
O_RDONLY | Opens the file for read-only |
O_WRONLY | Opens the file for write-only |
O_RDWR | Opens the file for read and write |
这些访问节点标志可以与下面给出的访问修饰符标志进行按位或运算,以更改文件的访问机制: Use Appends data to the end of the file (Applicable only to Regular files) Creates file if it does not exist (Applicable only to Regular files) It causes open function to fail if the named file exists already. Also, it can be used with the O_CREAT flag only. (Applicable only to Regular files) Specifies that any subsequent read or write on the file should be nonblocking (Applicable only to FIFO and device files) Specifies not to use named terminal device file as the calling process control terminal (Applicable only to terminal device files) Discards the file content and sets the file size to 0 bytes if the file exists (Applicable only to Regular files)Access modifier flag O_APPEND O_CREAT O_EXCL O_NONBLOCK O_NOCTTY O_TRUNC
笔记:
- 如果要以只读方式打开文件,则该文件应该已经存在,并且不能使用其他修饰符标志。
- 如果文件以读写或只写方式打开,则可以指定任何修饰符标志。
- 如果命名文件不存在且未指定 O_CREAT 文件,则 open函数将中止并返回失败状态。
第三个参数:许可
此参数仅在创建新文件时使用。仅当在 access_mode 参数中设置了 O_CREAT 标志时才需要这样做。它为其所有者、组成员和其他人指定文件的访问权限。此参数定义为 mode_t,其值应基于
SYMBOL MEANING
S_IRUSR read by owner
S_IWUSR write by owner
S_IXUSR execute by owner
S_IRWXU read, write and execute by owner
S_IRGRP read by group
S_IWGRP write by group
S_IXGRP execute by group
S_IRWXG read, write and execute by group
S_IROTH read by others
S_IWOTH write by others
S_IXOTH execute by others
S_IRWXO read, write and execute by others
示例 1:
int fdesc= open(“abc/xyz/geeksforgeeks”,O_RDWR | O_APPEND, 0);
This example opens an already existing file called /abc/xyz/geeksforgeeks for read and write in append mode
The access mode flag O_RDWR is bitwise ORed “|” with access modifier flag O_APPEND
示例 2:
让我们看看在 C 程序中使用开放 API,它演示了读取器和写入器进程之间的进程间通信。不要担心程序的功能或程序,因为它还有其他概念。只专注于使用开放 API。首先,使用 nano 编辑器创建两个 C 程序文件。
$nano write.c
输入这个命令后,会弹出nano编辑器。
在这个程序中,在第 13 行(fd=open(myfifo, O_WRONLY);),open API 用于以WRITE ONLY MODE (O_WRONLY)打开文件。在下一行文本中,“GeeksforGeeks”正在使用另一个名为 write API 的 API 写入文件。在此之后,文件描述符 fd 被关闭。结果,打开的文件有文本“GeeksforGeeks”。
同样,通过输入命令创建一个 read.c 文件:
$nano read.c
在这个程序中,在第 12 行(fd=open(myfifo, O_RDONLY);),open API 用于打开与“GeeksforGeeks”文本相同的文件。 API 以只读模式 (O_RDONLY)打开它。在下一行中,读取 API 用于从文件中读取数据并显示数据(“GeeksforGeeks”)。在此之后,文件描述符 fd 被关闭。
让我们看看 Ubuntu 上的终端屏幕:
我们已经讨论了前两个 nano 命令。第三个命令 ( cc write.c ) 编译 write.c 程序,./ a.out运行 write.c 程序。程序执行后,文件中写入了“GeeksforGeeks”文本,并显示一行“Writer进程已启动,现在再打开一个终端来运行reader进程”。
现在,再打开一个 Ubuntu 终端屏幕并执行如下图所示的命令:
第一个命令 ( cc read.c ) 编译 read.c 程序,./ a.out运行 read.c 程序。执行后,可以看到正在显示文件中的数据。
这是可能的,因为文件是以只读模式打开的,并且数据被读取 API 读取并显示出来。