从本次提交开始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/