Почему 64-битные системы не имеют системных вызовов типа Creat? - PullRequest
0 голосов
/ 13 октября 2019

Из этого коммита https://github.com/torvalds/linux/commit/a0673fdbcd42105261646cd4f3447455b5854a32 Я узнал, что есть некоторые системные вызовы 32-битной спецификации, такие как creat, которые были удалены на архитектурах, таких как arm64.

Из руководства glibc для Creat :

creat ()

Вызов creat()эквивалентно вызову open() с флагами, равными 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

, которая исчезнет до open syscall, если creat syscall недоступен. Но я все еще не могу понять, что не так, если у нас все еще есть creat как syscall в 64-битных архитектурах.

1 Ответ

4 голосов
/ 13 октября 2019

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() (да, третий, аргумент mode является необязательным), вам больше не нужен creat() - вы можете сделать все это с помощью open() и затем некоторых.

Нет необходимости, чтобы creat() был системным вызовом, отдельным от open(), поэтому большинство современных кодов (скажем, код, написанный в текущем тысячелетии) в любом случае не использует creat(). Я не знаю, когда я в последний раз писал код, используя creat() - это было давно время назад. (Я искал свой исходный код; было две программы, все еще с вызовами creat(), но оба эти вызова были в версии 1.1 кода, датированной январем и февралем 1990 года. У меня нет никаких записей об использовании этого в моем собственномкод с тех пор.)

...