在perl中使用stat时$ mode会保存什么

时间:2013-05-10 03:05:17

标签: perl

伙计们试图使用stat来查看perl中某个文件的权限。

所以当我这样做时

foreach (@original_files) {
    my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
      $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat ($_);

    print "$mode \n";
}

此输出:

33204 which corresponds to the permission -rw-rw-r--

我无法理解为什么它是33204.< - 这是我的第一个问题

接下来我尝试将$ mode转换为octal,我知道这是umask的数字系统。

这是我的代码:

printf ("%0\n",$mode);

现在这输出100664,我完全低于最后3位数字(rw-rw-r--)但是我不明白前三位来自哪里(100664中的100) 这是我的第二个问题

最后我再次尝试使用此代码:

printf ("%o\n", $mode & 775); #im not sure about the 775, or is it 577

最后一个代码是我想要的。它输出664.我的问题是为什么当我和$模式忘记了价值(775或其他)时,它会输出正确的权限。?

OT问题: $ _和@_ 的区别是什么?

2 个答案:

答案 0 :(得分:6)

从我的网站托管商的man 2 stat关于模式:

S_IFMT     0170000   bit mask for the file type bit fields
S_IFSOCK   0140000   socket
S_IFLNK    0120000   symbolic link
S_IFREG    0100000   regular file
S_IFBLK    0060000   block device
S_IFDIR    0040000   directory
S_IFCHR    0020000   character device
S_IFIFO    0010000   FIFO
S_ISUID    0004000   set UID bit
S_ISGID    0002000   set-group-ID bit (see below)
S_ISVTX    0001000   sticky bit (see below)
S_IRWXU    00700     mask for file owner permissions
S_IRUSR    00400     owner has read permission
S_IWUSR    00200     owner has write permission
S_IXUSR    00100     owner has execute permission
S_IRWXG    00070     mask for group permissions
S_IRGRP    00040     group has read permission
S_IWGRP    00020     group has write permission
S_IXGRP    00010     group has execute permission
S_IRWXO    00007     mask for permissions for others (not in group)
S_IROTH    00004     others have read permission
S_IWOTH    00002     others have write permission
S_IXOTH    00001     others have execute permission

(请注意,前导0表示这些数字是八进制数。)

您可以在mode字词中看到七个字段。

S_IFMT   file type
S_ISUID  set UID bit
S_ISGID  set-group-ID bit
S_ISVTX  sticky bit
S_IRWXU  owner permissions
S_IRWXG  group permissions
S_IRWXO  other permissions

如果您将模式视为字段而不是数字(0x81B4 = 33204 = 0100664 = 0b1000000110110100),您将获得:

S_IFMT:  S_IFREG (regular file)
S_ISUID: 0 (no set UID bit)
S_ISGID: 0 (no set-group-ID bit)
S_ISVTX: 0 (no sticky bit)
S_IRWXU: S_IRUSR | S_IWUSR (user has rw)
S_IRWXG: S_IRGRP | S_IWGRP (group has rw)
S_IRWXO: S_IROTH (other has r)

执行& 0777与执行& (S_IRWXU | S_IRWXG | S_IRWXO)相同,后者会提取包含各种权限的字段。


$_是一个引用$main::_的变量。它由一些构造(foreach循环,mapgrep)设置,并被许多运算符用作默认值(例如say;表示say $_;)。

@_的元素别名为传递给正在执行的子的参数。例如$_[0]因此$x4

中包含sub f { my ($x) = @_; ... } f(4);

答案 1 :(得分:2)

  1. -rw-rw-r--对应二进制数110110100(第一个 - 不是权限)。当我们处理三位组时,为了方便起见,我们使用八进制(将三位组映射到0-7):644。

  2. 要理解100644中的100,man 2 stat

  3. 关于:

    printf(“%o \ n”,$ mode& 775); #im不确定775,还是577

  4. 775是十进制,而不是八进制。如果你只想要最后9位,那么AND数字与八进制777(=所有位设置,二进制111_111_111)。

    printf "%o\n", 0100664 & 0777;  # 664