【发布时间】:2020-12-24 11:36:07
【问题描述】:
Here,我在询问为OS161 实现sys_open 系统调用的分配,该系统调用将由open 函数调用。
open函数的定义如下:
int open(const char *filename, int flags, ...);
手册页如下所示:
概要
#include <unistd.h>
#include <fcntl.h>
int
open(const char *filename, int flags);
int
open(const char *filename, int flags, mode_t mode);
由于它是一个可变参数函数,它可以接受尽可能多的参数,但只定义了具有 2 个或 3 个参数的情况。
我的问题是如何确定传递给open 的参数数量,是2 还是3。如果在flags 中设置了O_CREAT 位,则提供mode 的答案方式。
但我在操作系统中看到了一些看起来像这样的代码:
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC);
在这种情况下,mode 的值将是 a2 寄存器中的任何值,而不是有效值。
1 - 在这种情况下会发生什么,在这种情况下我应该怎么做?参数如何传递?它是否在a2 寄存器中传递了一个零(不太可能发生)?或者它只是留下寄存器中的任何值?无论如何,如何确定最后一个参数是否有效?
我曾经让 sys_open 函数接收 3 个参数,并且如果设置了 O_CREAT 位,则仅使用最后一个 (mode)。但是现在由于可以使用设置的位并且没有第三个参数来调用该函数,因此即使 mode 的值无效,我仍然可以使用它。
2 - 处理参数的逻辑应该是什么?
系统调用的发出方式在上述问题中有详细说明。
【问题讨论】:
-
这能回答你的问题吗? Unix O_CREAT flag without mode specified
标签: c operating-system kernel mips system-calls