从此提交https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32
我了解到,有一些32位规范的系统调用,例如creat
,在诸如arm64之类的体系结构中已被删除。
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
,我仍然无法弄清问题所在。
答案 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版代码。我没有在其中使用过任何记录。此后就是我自己的代码。)