从此提交https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32我了解到有一些32位规范的系统调用,例如creat
,已在arm64等体系结构上删除。
creat()
对
creat()
的调用等效于使用等于open()
的标志调用O_CREAT|O_WRONLY|O_TRUNC
。
IIUC,creat
实际上可以通过open
实现,但是我还了解到creat
在open
之后。如果要创建而不是打开文件,则调用creat
应该更方便。当然,我们可以始终使用create的glibc版本:
/* 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);
}
限定词)。
创建static inline
时,creat()
没有创建文件的选项;它只能打开现有文件。它没有全部的open()
名称;您使用了O_xyz
(对于0
),O_RDONLY
(对于1
)和O_WRONLY
(对于2
),这些都是可用的选项。现在,使用
实际上,O_RDWR
的“可变参数”版本(是的,第三个,模式参数是可选的,您不再需要open()
-您可以使用open()
然后再做一些。creat()
不需要是与open()
分开的系统调用,因此,大多数现代代码(例如,在当前千年中编写的代码)都不会使用creat()
。我不知道我上次使用open()
编写代码的时间-以前是long
。 (我搜索了源代码;仍然有两个程序带有creat()
调用,但是这些调用都在1990年1月和1990年2月的代码版本1.1中。我没有任何使用它的记录。此后的代码。)