从本次提交开始https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32
我了解到有一些32位规范的系统调用,比如creat,它们已经在arm64这样的架构上被删除了。
glibc manual for creat开始:
创建()
调用creat()等同于使用等于open()的标志调用O_CREAT|O_WRONLY|O_TRUNC
IIUC,creat实际上可以通过open实现,但我也了解到creat是在open之后实现的。如果我想创建而不是打开文件,那么调用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

如果open syscall不可用,它将变为creat syscall。但如果我们在64位体系结构中仍然有creat作为syscall的话,我仍然无法找出问题所在。

最佳答案

creat()调用仍然是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()的“变量参数”版本(是的,第三个模式参数是可选的),您不再需要creat()-您可以使用open()完成所有操作,然后再使用一些。
实际上不需要将creat()作为独立于open()的系统调用,因此,大多数现代代码(例如,在当前千年中编写的代码)无论如何都不使用creat()。我不知道上次用creat()编写代码是什么时候-那是很久以前的事了。(我搜索了我的源代码;有两个程序仍然带有creat()调用,但这些调用都在1990年1月和2月的1.1版代码中。从那以后,我没有在自己的代码中使用过它的任何记录。)

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

10-10 13:44