#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()
системный вызов. Таким образом, вы не можете навсегда потерять способность записывать этот файл; вы можете вернуть себе эту способность, когда захотите.