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

问题描述 投票:0回答:1

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

glibc manual for creat

creat()

creat()的调用等效于使用等于open()的标志调用O_CREAT|O_WRONLY|O_TRUNC

IIUC,creat实际上可以通过open实现,但是我还了解到creatopen之后。如果要创建而不是打开文件,则调用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,我仍然无法弄清楚出什么问题。

c linux-kernel system-calls libc
1个回答
4
投票
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中。我没有任何使用它的记录。此后的代码。)
© www.soinside.com 2019 - 2024. All rights reserved.