Как режим влияет на разрешение для вновь созданных файлов в Linux?

#c #linux

#c #linux

Вопрос:

Я новичок в Linux, все еще пытаюсь понять, как работает управление разрешениями в Linux. Прототип open функции похож на sth :

 int open(char *filename, int flags, mode_t mode);
  

Пусть у меня есть следующий код:

 fd = open("foo.txt", O_CREAT|O_RDWR, S_IRUSR)
  

и, допустим, файл «foo.txt » раньше не существовало, поэтому приведенное выше утверждение создаст файл с именем «foo.txt «, и текущий процесс, который выполняет это open утверждение, может читать и записывать этот файл. Но после завершения этого процесса, если запускается другой процесс и пытается открыть этот файл. Ниже мой вопрос:

Q1 -Поскольку файл был создан с помощью S_IRUSR (владелец может прочитать этот файл) при первом open вызове, означает ли это, что даже я, как владелец файла, если я снова начну новый процесс для открытия этого файла, я смогу только прочитать этот файл и не смогу записать этот файл, насколько я понимаюправильно? Если я правильно понимаю, разумно ли / целесообразно ли, чтобы владельцы создавали sth, чтобы они не могли иметь к нему полный доступ позже?

Q2-Если мое понимание выше верно, то во втором вызове open нового процесса. Я могу вызывать только как:

 fd = open("foo.txt", O_RDONLY)  // uses flags like O_WRONLY or O_RDWR will throw an error?
  

поскольку в первом open был указан режим as S_IRUSR , который отображается O_RDONLY в последующих вызовах, правильно ли я понимаю?

Ответ №1:

Правильно, если вы создаете файл с разрешениями S_IRUSR (часто записываемыми в восьмеричном виде 0400 ), вы не сможете открыть файл для записи. Попытка сделать это завершится неудачей и установит значение errno EACCES равным .

Это довольно практично, поскольку дает вам возможность защитить файлы, которые вы не хотите случайно перезаписывать, при условии, что разрешения остаются неизменными. Однако, как владелец, вы можете изменить разрешения позже, используя chmod() системный вызов. Таким образом, вы не можете навсегда потерять способность записывать этот файл; вы можете вернуть себе эту способность, когда захотите.