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

时间:2019-10-13 08:41:16

标签: c linux-kernel system-calls libc

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

glibc manual for creat

  

creat()

     

creat()的调用等同于使用标志等于open()的{​​{1}}。

IIUC,O_CREAT|O_WRONLY|O_TRUNC实际上可以通过creat实现,但我还了解到open紧跟在creat之后。如果要创建而不是打开文件,则调用open应该更方便。当然,我们总是可以使用create的glibc版本:

creat

,如果/* 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。但是,如果在64位体系结构中仍将creat syscall设置为creat,我仍然无法弄清问题所在。

1 个答案:

答案 0 :(得分:4)

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()的“可变参数”版本(是的,第三个模式参数是可选的),您不再需要creat() -您可以使用{{1} },然后再添加一些。

实际上没有必要将open()creat()分开进行系统调用,因此,大多数现代代码(例如,在当前千年中编写的代码)都不使用open()无论如何。我不知道我上一次使用creat()编写代码的时间-很久以前。 (我搜索了源代码;仍然有两个程序带有creat()调用,但是这些调用都是1990年1月和1990年2月的1.1版代码。我没有在其中使用过任何记录。此后就是我自己的代码。)