indietro

  • stat FILEHANDLE
  • stat ESPR
  • stat

    Restituisce una lista di 13 elementi che forniscono le informazioni di stato per un file, sia che il file sia aperto tramite FILEHANDLE, sia che venga fissato da ESPR. Se ESPR viene omessa, stat viene eseguito su $_. Restituisce una lista nulla se la stat fallisce. Viene tipicamente usata nella maniera seguente:

        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
           $atime,$mtime,$ctime,$blksize,$blocks)
               = stat($nomefile);

    Va notato che tutti i campi sono supportati su tutti i tipi di filesystem. Ecco i significati dei campi:

      0 dev      numero di device del filesystem
      1 ino      numero di inode
      2 mode     modalitE<agrave> del file  (tipo e permessi)
      3 nlink    numero di (hard) link al file
      4 uid      ID numerico dell'utente del proprietario del file
      5 gid      ID numerico del gruppo del proprietario del file
      6 rdev     l'identificativo di device (solo file speciali)
      7 size     dimensione totale del file, in byte
      8 atime    istante in secondi dell'ultimo accesso dall'epoch
      9 mtime    istante in secondi dell'ultima modifica dall'epoch
     10 ctime    istante in secondi di modifica dell'inode dall'epoch (*)
     11 blksize  dimensione preferita dei blocchi per l'I/O del filesystem
     12 blocks   numero di blocchi realmente allocati

    (L'epoch è stato alle 00:00 del 1 gennaio 1970 GMT).

    (*) Non tutti i campi sono supportati da tutti i tipi di filesystem. Degno di nota il fatto che il campo ctime non è portabile. In particolare non ci si può aspettare esso sia un "tempo di creazione", si veda perlport/"Files and Filesystems" ["File e Filesystem", NdT] per dettagli.

    Se a stat viene passato lo speciale filehandle che consiste in un carattere di sottolineatura, non viene eseguita alcuna stat ma vengono restituiti i contenuti correnti della struttura di stat provenienti dall'ultima stat, lstat o filestat. Ad esempio:

        if (-x $file && (($d) = stat(_)) && $d < 0) {
    	print "$file E<egrave> un file NFS eseguibile\n";
        }

    (Questo funziona solo su elaboratori per i quali il numero di device è negativo sotto NFS).

    Visto che la modalità contiene sia il tipo di file che i suoi permessi, se volete vedere gli effettivi permessi dovreste mascherare la porzione relativa al tipo di file e utilizzare (s)printf usando un "%o".

        $modalita = (stat($nomefile))[2];
        printf "I permessi sono %04o\n", $modalita & 07777;

    In un contesto scalare, stat restituisce un valore booleano che indica il successo o l'insuccesso e, in caso di succcesso, imposta l'informazione associata con lo speciale filehandle _.

    Il modulo File::stat fornisce un conveniente meccanismo di accesso mediante nome:

        use File::stat;
        $sb = stat($nomefile);
        printf "File is %s, size is %s, perm %04o, mtime %s\n",
    	$nomefile, $sb->size, $sb->mode & 07777,
    	scalar localtime $sb->mtime;

    Potete importare le costanti (S_IF*) e funzioni (S_IS*) delle modalità simboliche, dal modulo Fcntl:

        use Fcntl ':mode';
        $modalita = (stat($nomefile))[2];
        $utente_rwx       = ($modalita & S_IRWXU) >> 6;
        $gruppo_lettura   = ($modalita & S_IRGRP) >> 3;
        $altri_esecuzione =  $modalita & S_IXOTH;
        printf "I permessi sono %04o\n", S_IMODE($modalita), "\n";
        $e_setuid     =  $mode & S_ISUID;
        $e_setgid     =  S_ISDIR($modalita);

    Potete scrivere le ultime due utilizzando gli operatori -u e -d. Le costanti S_IF* comunemente disponibili sono

        # Permessi: lettura, scrittura, eseczuione, per l'utente, gruppo, altri.
        S_IRWXU S_IRUSR S_IWUSR S_IXUSR
        S_IRWXG S_IRGRP S_IWGRP S_IXGRP
        S_IRWXO S_IROTH S_IWOTH S_IXOTH
        # Setuid/Setgid/Relativo allo sticky bit/SaveText.
        # Va notato che l'esatto significato di questi, e` dipendente dal sistema.
        S_ISUID S_ISGID S_ISVTX S_ISTXT
        # Tipi di file. Non tutti sono necessariamente disponibili sul vostro sistema.
        S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
        # Le seguenti sono alias di compatibilita` per S_IRUSR, S_IWUSR, S_IXUSR.
        S_IREAD S_IWRITE S_IEXEC

    e le funzioni S_IF* sono

        S_IMODE($modalita)	la parte di $modalita contenente i bit dei permessi
                            e i bit di setuid/setgid/sticky
        S_IFMT($modalita)	la parte di $modalita contenente il tipo del file
                            che puo` essere fatta oggetto di un and su bit con ad esempio
                            S_IFREG o con le seguenti funzioni
        # Gli operatori -f, -d, -l, -b, -c, -p e -S.
        S_ISREG($modalita) S_ISDIR($modalita) S_ISLNK($modalita)
        S_ISBLK($modalita) S_ISCHR($modalita) S_ISFIFO($modalita) S_ISSOCK($modalita)
        # Non esiste una controparte all'operatore -X ma, per il primo,
        # l'operatore -g e` spesso equivalente. L'ENFMT sta per
        # record flocking enforcement [l'applicazione forzata del flock ad un record, NdT], 
        # una caratteristica indipendente dalla piattaforma.
        S_ISENFMT($modalita) S_ISWHT($modalita)

    Consultate la vostra documentazione locale di chmod(2) e stat(2) per maggiori dettagli sulle costanti S_*. Per ottenere l'informazione dello stato per un link simbolico, utilizzate la funzione lstat invece del file puntato dal link.