📜  什么是 UNIX 中的开放 API?

📅  最后修改于: 2022-05-13 01:57:32.188000             🧑  作者: Mango

什么是 UNIX 中的开放 API?

UNIX 中有一组用于操作文件的通用 API。这些 API 之一是开放 APIopen 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_RDONLYOpens the file for read-only
O_WRONLYOpens the file for write-only
O_RDWROpens the file for read and write

这些访问节点标志可以与下面给出的访问修饰符标志进行按位或运算,以更改文件的访问机制:

Access modifier flag

Use

O_APPEND

Appends data to the end of the file

(Applicable only to Regular files)

O_CREAT

Creates file if it does not exist

(Applicable only to Regular files)

O_EXCL

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)

O_NONBLOCK

Specifies that any subsequent read or write on the file should be nonblocking

(Applicable only to FIFO and device files)

O_NOCTTY

Specifies not to use named terminal device file as the calling process control terminal

(Applicable only to terminal device files)

O_TRUNC

Discards the file content and sets the file size to 0 bytes if the file exists

(Applicable only to Regular files)

笔记:

  • 如果要以只读方式打开文件,则该文件应该已经存在,并且不能使用其他修饰符标志。
  • 如果文件以读写或只写方式打开,则可以指定任何修饰符标志。
  • 如果命名文件不存在且未指定 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:



示例 2:

让我们看看在 C 程序中使用开放 API,它演示了读取器和写入器进程之间的进程间通信。不要担心程序的功能或程序,因为它还有其他概念。只专注于使用开放 API。首先,使用 nano 编辑器创建两个 C 程序文件。

$nano write.c

输入这个命令后,会弹出nano编辑器。

openAPI的write.c文件

在nano编辑器中输入这个程序write.c,然后保存退出编辑器

在这个程序中,在第 13 行(fd=open(myfifo, O_WRONLY);),open API 用于以WRITE ONLY MODE (O_WRONLY)打开文件在下一行文本中,“GeeksforGeeks”正在使用另一个名为 write API 的 API 写入文件。在此之后,文件描述符 fd 被关闭。结果,打开的文件有文本“GeeksforGeeks”。  

同样,通过输入命令创建一个 read.c 文件:

$nano read.c
read.c 文件以读取模式打开文件以打开 API

在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 读取并显示出来。