首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当设置O_CREAT位但只为open()提供两个参数时,会发生什么情况?

当设置O_CREAT位但只为open()提供两个参数时,会发生什么情况?
EN

Stack Overflow用户
提问于 2020-09-05 12:34:35
回答 1查看 195关注 0票数 0

Here,我在询问如何为OS161实现sys_open syscall,这将由open函数调用。

open函数的定义如下:

代码语言:javascript
复制
int open(const char *filename, int flags, ...);

手册页是这样的:

提要

代码语言:javascript
复制
#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

但我在操作系统中看到了一些代码,如下所示:

代码语言:javascript
复制
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC);

在这种情况下,mode的值将是a2寄存器中的值,而不是有效值。

1-在这种情况下发生了什么,在这种情况下我应该做什么?参数是如何传递的?它是否在a2寄存器中传递零(不太可能发生)?还是只留下了登记簿上的任何价值?在任何情况下,如何确定最后一个参数是否有效?

我曾经让sys_open函数接收3个参数,并且只有在设置了O_CREAT位时才使用最后一个参数(mode)。但是现在,由于函数可以用位集调用,而且没有第三个参数,所以即使mode无效,我仍然可以使用它的值。

2-处理这些论点的逻辑应该是什么?

上述问题详细介绍了syscall的发布方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-05 12:46:02

POSIX文件简单地指出:

模式将设置为oflag参数之后的参数值,该参数作为mode_t类型进行修改,如下所示:

它没有指定当您省略该参数时会发生什么,因此建议您确保它在那里(在客户端)。最有可能的情况是,它将使用参数所在的位置(无论是在寄存器还是内存中,取决于调用约定),而正确值的可能性很小。

Linux文档在这个问题上有如下说明(我的重点是):

如果在flags中指定了O_CREATO_TMPFILE,则必须提供参数;如果没有提供,则必须将堆栈中的任意字节作为文件模式应用。。

当然,这并不是一份标准文档,因为“必须”这个词是你必须做的一个坚实的要求(否则所有的赌注都会被忽略),但是你应该这样读它。因此,再次,您应该确保您提供它。

所以我想说,你处理它的方式如下:

  • 如果在客户端/调用方,请确保提供该模式。服务器/被调用方的
  • 假设调用方提供了它,因为如果他们没有提供,那么他们就违反了合同。POSIX中似乎没有合适的错误返回(无论是在“将失败”部分还是“可能失败”部分),即使您可以检测到,也不适合指示此问题。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63753992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档