为什么64位系统没有像creat这样的系统调用?
Why don't 64-bit systems have syscalls like creat?
来自这个提交 https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32
我了解到有一些 32 位规范的系统调用,如 creat
,已在 arm64 等架构上被删除。
creat()
A call to creat()
is equivalent to calling open()
with flags equal to 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
如果 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 月。我没有任何使用它的记录从那以后我自己的代码。)
来自这个提交 https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32
我了解到有一些 32 位规范的系统调用,如 creat
,已在 arm64 等架构上被删除。
creat()
A call to
creat()
is equivalent to callingopen()
with flags equal toO_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
如果 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 月。我没有任何使用它的记录从那以后我自己的代码。)