gpt4 book ai didi

c - 为什么64位系统没有像creat这样的系统调用?

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:20 25 4
gpt4 key购买 nike

来自此提交 https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32我了解到有一些 32 位规范的系统调用,如 creat,已在 arm64 等架构上被删除。

来自glibc manual for creat :

creat()

A call to creat() is equivalent to calling open() with flags equal to O_CREAT|O_WRONLY|O_TRUNC.

IIUC,creat实际上可以通过open来实现,但我也了解到creatopen之后.如果我想创建而不是打开文件,调用 creat 应该更方便。当然,我们总是可以使用 glibc 版本的 create:

/* Create FILE with protections MODE.  */
int
__creat64 (const char *file, mode_t mode)
{
#if defined __OFF_T_MATCHES_OFF64_T && defined __NR_creat
return SYSCALL_CANCEL (creat, file, mode);
#else
/* We need to pass O_LARGEFILE. */
return __open64 (file, O_WRONLY | O_CREAT | O_TRUNC, mode);
#endif
}
weak_alias (__creat64, creat64)

#ifdef __OFF_T_MATCHES_OFF64_T
strong_alias (__creat64, __creat)
weak_alias (__creat64, creat)
#endif

如果 creat syscall 不可用,它将淡出到 open syscall。但是如果我们仍然将 creat 作为 syscall 在 64 位架构中,我仍然无法弄清楚出了什么问题。

最佳答案

creat() call 仍然是 POSIX 所必需的,但没有明显的理由不能将其实现为:

static inline int creat(const char *name, int mode)
{
return open(name, O_WRONLY|O_CREAT|O_TRUNC, mode);
}

事实上,POSIX 说它应该被实现就好像那样(提供或采用static inline 限定符)。

创建creat() 时,open() 没有创建文件的选项;它只能打开现有文件。它没有所有的 O_xyz 名称;您使用了 0(对于 O_RDONLY)、1(对于 O_WRONLY)和 2 (对于 O_RDWR)——这些都是可用的选项。

如今,使用“可变参数”版本的 open() (是的,第三个 mode 参数是可选的),您不再需要 creat() — 您可以使用 open() 完成这一切。

creat() 确实没有必要成为与 open() 分开的系统调用,因此,大多数现代代码(例如,用当前语言编写的代码millennium) 无论如何都不使用 creat()。我不知道我上次使用 creat() 编写代码是什么时候 — 那是 很久 以前的事了。 (我搜索了我的源代码;有两个程序仍然有 creat() 调用,但这些调用都在代码的 1.1 版本中,日期为 1990 年 1 月和 2 月。我没有任何记录从那时起就在我自己的代码中使用它。)

关于c - 为什么64位系统没有像creat这样的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58361903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com