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

Why don't 64-bit systems have syscalls like creat?

来自这个提交 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。但是我仍然无法弄清楚如果我们在 64 位架构中仍然有 creat 作为 syscall 是什么问题。

POSIX 仍然需要 creat() 调用,但没有明显的原因不能将其实现为:

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() 的 'variable arguments' 版本(是的,第三个模式参数是可选的),您不再需要 creat() — 您可以使用 open() 然后是一些。

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