2012-02-08 9 views
0

ここにはわかりません。 perlで、 perlのchmod関数とmkdir関数へのアクセス権の受け渡し

my $mode = (stat $file)[2]; 
その後、 $fileのは、私はファイル(ハンドル)を持って言わせては種類と権限として記述ファイルの モードを与えます。次に、 chmodのドキュメントでは、 statから chmodにモードを送信するときにファイルタイプをマスクすることをお勧めします。

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

同様に、mkdirためのドキュメントはmkdir(FILENAME,MASK)が「(umaskで修正されるように)MASKで指定された権限を持つFILENAMEによって指定されたディレクトリを作成する。」ことを示しています

Alrighty。ここに私が得ないものがあります。コマンドラインでは、デフォルトの権限drwxr-xr-x(8進数0755)を使用して、自分のホームディレクトリにdir tempを作成します。その後

  1. perlのSTATは、このディレクトリのモードは、私は、X =(1)でchmod(x,'temp')を期待16877.
  2. $perms = (stat 'temp')[2] & 07777;リターン493
  3. $perms = sprintf("%04o",(stat 'temp')[2] & 07777);戻っ0755

であることを私に告げると、 (2)temp/のパーミッションを何かに変更する。しかし、すべての3つのdrwxr-xr-xを与える(確かに(3)あなたはchmod(oct($perms),'temp);を行う必要があります)同様に、mkdir(temp,16877)mkdir(temp,493)mkdir(temp,0755)はすべてtemp/に許可drwxr-xr-xを与える。

私の質問:本当に何が起こっているのですか?どのようにchmodとmkdirがこれらの3つの異なる値をとり、temp/に同じアクセス権を設定するのですか?私は1つの答えが「それを行う方法は2つ以上あります」と思っていますが、それは問題ありませんが、ここで何が起こっているのかを理解したいと思います。また、権限値をこれらの関数に渡すために推奨される方法は何ですか?ありがとう!

+0

x =(1)と(2)で "chmod(x、 'temp')というフレーズを理解できません。明確にすることはできますか? – msw

答えて

4

493 decimal = 0755 octalです。したがって、これは問題ではありません。これらは同じです。 16877 decimal = 40755 octal。 chmodは必要なビットだけを使用し、上位ビットのものは無視します。

+1

07777より大きいビットは、システムがそのように正当性を保護するため、 'chmod'によって変更されません。たとえば、プログラムがS_IFDIR(04000)を変更できるようにすると、通常のファイルをディレクトリに、またはその逆に変更できます。それは悪いです。同様にS_IFBLK(060000)は 'mknod(2)'によってのみ設定され、一度ブロックデバイスになると、常にブロックデバイスがこれらのビットを変更することは意味をなさないでしょう。 – msw

+0

John3136とmsw - ありがとうございます。ドキュメントからの '&07777'は必要ありません。また、mkdirとchmodがこの引数を別々に扱うケースがありますか? – Jason

+1

&07777は、フラグを12ビット分だけ渡していることを確認します。賢明なOSはとにかく07777を超えるものは無視しますが、ANDを実行するのは良いプログラミングです。 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の8進数です。余分な40000はFcntl::S_IFDIRに相当し、$fileがディレクトリであることがわかります。

関連する問題