2012-02-08 2 views
0

Вот что я не понимаю. В Perl'е, скажем, у меня есть файл (ручка) $file затемПередача разрешений на функции chmod и mkdir perl

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') Я ожидал, что при х = (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/? Я понимаю, что один ответ может быть «есть несколько способов сделать это», и это прекрасно, насколько это возможно, но я хотел бы понять, что здесь происходит. Кроме того, каков рекомендуемый способ передачи значений разрешений этим функциям? Благодаря!

+0

Я не могу понять выражение «chmod (x,« temp ») с x = (1) и (2)». Вы можете уточнить? – msw

ответ

4

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

+1

Биты выше 07777 не будут изменены 'chmod', потому что система защищает разумность таким образом. Например, разрешая программе изменять S_IFDIR (04000), можно изменить обычный файл в каталог или наоборот; это было бы плохо.Аналогично, S_IFBLK (060000) будет устанавливаться только 'mknod (2)', и как только блочное устройство всегда будет блочным устройством, так что изменение этих битов не имеет смысла. – msw

+0

Спасибо John3136 и msw - уточнить: «& 07777» из документов не требуется. Кроме того, существуют случаи, когда mkdir и chmod обрабатывают этот аргумент по-другому? – Jason

+1

& 07777 просто гарантирует, что вы проходите только в размере 12 бит. Разумная ОС в любом случае проигнорировала бы что-либо выше 07777, но выполнение И - хорошая практика программирования. mkdir использует маску, представленную как измененную текущей umask. chmod не будет использовать cuirrent umask, поэтому поведение может быть другим. – John3136

2

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

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

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

Смежные вопросы