В качестве примера следующий код открывает файл, указанный при помощи
аргумента file, для записи. Если файл не существует, то с учетом umask 022 он
создается с разрешением 0644 (хотя аргумент mode равен 0664). Если файл существует,
то он усекается до нулевой длины:
int fd.
fd = open ( file . 0_WR0NLY | 0_CREAT | 0_TRUNC.
S_IWUSR I S_IRUSR I SJWGRP | SJRGRP | SJROTH).
i f (fd == -1)
/* ошибка */
Функция creat()
Комбинация 0_WR0NLY | 0_CREAT | 0_TRUNC настолько распространена, что существует
отдельный системный вызов, обеспечивающий как раз это поведение:
finclude
finclude
finclude
int creat (const char *name, modet mode):
ПРИМЕЧАНИЕ--------------------------------------------- ;------------------------------------------
Да, все правильно, в имени функции отсутствует буква е (creat вместо create). Кен Томпсон, создатель
Unix, однажды пошутил, что эта отсутствующая буква - самая большая оплошность в дизайне
Unix.
Это типичный вызов creat():
int fd:
fd = creat ( file . 0644):
i f (fd - -1)
/* ошибка */
Он идентичен следующему вызову:
int fd:
fd = open ( file . 0_WR0NLY I 0_CREAT | 0_TRUNC, 0644).
i f (fd == -1)
/* ошибка */
В большинстве архитектур Linux1 c re a tO - это системный вызов, хотя его
довольно просто реализовать в пользовательском пространстве:
int creat (const char *name, int mode)
{
return open (name, 0_WR0NLY | 0_CREAT | 0_TRUNC. mode):
}