Передача разрешений в функции Perl для chmod и mkdir - PullRequest
0 голосов
/ 08 февраля 2012

Вот что-то, чего я не понимаю. Допустим, в Perl у меня есть файл (дескриптор) $file, затем

my $mode = (stat $file)[2];

дает режим файла, описанного как тип и права доступа. Затем в документах для chmod рекомендуется маскировать тип файла при отправке режима с stat на chmod , например,

my $perm = (stat $file)[2] & 07777;
chmod($perm | 0600, $file);

Точно так же документы для mkdir указывают, что mkdir(FILENAME,MASK) "создает каталог, заданный FILENAME, с разрешениями, указанными MASK (изменено umask)."

Alrighty. Вот что я не понимаю. В командной строке я создаю dir temp в своем домашнем каталоге с правами по умолчанию drwxr-xr-x (восьмеричное 0755). Тогда

  1. Статистика perl говорит мне, что режим этого каталога - 16877.
  2. $perms = (stat 'temp')[2] & 07777; возвращает 493.
  3. $perms = sprintf("%04o",(stat 'temp')[2] & 07777); возвращает 0755.

Я ожидал, что chmod(x,'temp') с x = (1) и (2) изменит разрешения на temp/ на что-то странное. Но все три дают drwxr-xr-x (по общему признанию с (3) вы должны сделать chmod(oct($perms),'temp);) Точно так же, mkdir(temp,16877), mkdir(temp,493), mkdir(temp,0755) все дают разрешения drwxr-xr-x на temp/.

Итак, мой вопрос: что на самом деле происходит? Как получается, что chmod и mkdir принимают эти три разных значения и устанавливают одинаковые разрешения для temp/? Я понимаю, что один ответ может быть «есть несколько способов сделать это», и это нормально, насколько это возможно, но я хотел бы понять, что здесь происходит. Кроме того, каков рекомендуемый способ передачи значений разрешений этим функциям? Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

493 десятичных = 0755 восьмеричных, так что это не проблема - они идентичны.16877 десятичных = 40755 восьмеричных.Похоже, что chmod использует только те биты, которые ему нужны, и игнорирует все в битах более высокого порядка.

2 голосов
/ 08 февраля 2012

Не все поля поддерживаются всеми типами файловых систем. Вот значения полей:

    0 dev      device number of filesystem
    1 ino      inode number
    2 mode     file mode  (<b>type</b> and permissions)

(stat $file)[2], согласно документам, это режим файла , состоящий из типа и разрешений. 16877 десятичное - 40755 восьмеричное. Дополнительные 40000 эквивалентны Fcntl::S_IFDIR, сообщая, что $file является каталогом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...