0

こんにちは私はシステムコールを理解しようとしています:UNIX上のディレクトリとファイル..私はこのウェブサイトを見つけました。彼らは彼ら自身の例でいくつかのコールを説明していますが、これらのコードスニペットを理解していません..

    void state (char *file) 
    {
    struct stat    buf;
    struct passwd *pw;
    struct group  *gr;
    int i;

    if (stat(file, &buf)==-1)
    {
    perror(file);
    exit(-1);
    }

    printf ("file: %s\n", archivo);
    printf ("\t resides in the device: %d, %d\n",(buf.st_dev & 0xFF00)>>8,            buf.st_dev   &   0x00FF);
    printf ("\t  i-node number: %d\n", buf.st_ino);
    printf ("\t type: ");
    switch (buf.st_mode & S_IFMT)
    {
    case S_IFREG: printf ("ordinario\n");     break;
    case S_IFDIR: printf ("directorio\n");    break;
    case S_IFCHR: printf ("tipo caracter\n"); break;
    case S_IFBLK: printf ("tipo bloque\n");   break;
    case S_IFIFO: printf ("FIFO\n");          break;
    }

  if (buf.st_mode & S_ISUID) printf ("\tSUID activo");
  if (buf.st_mode & S_ISGID) printf ("\tSGID activo");
  if (buf.st_mode & S_ISVTX) printf ("\tStiky bit activo\n");

  /* Permissions access */
  printf ("\tPermission: 0%o ",buf.st_mode & 0777);
  for (i=0; i<9; i++)
      if (buf.st_mode & (0400>>i)) printf ("%c", permisos[(8-i)%3]);
      else  printf ("-"); ....

どのデバイスファイルが欠落しているかを確認するための比較がわかりません..誰かが私を理解するのを手伝ってくれるでしょうか?特にここに..

printf ("\tReside en el dispositivo: %d, %d\n", (buf.st_dev & 0xFF00)>>8,
buf.st_dev & 0x00FF);



/* Permissions */
  printf ("\tPermission: 0%o ",buf.st_mode & 0777);
  for (i=0; i<9; i++)
      if (buf.st_mode & (0400>>i)) printf ("%c", permisos[(8-i)%3]);
      else  printf ("-");

両側で行われた比較の助けや説明を歓迎しますPD:私の英語=Pでごめんなさい

estado.cと呼ばれるコード例1全体が表示されるリンク

http://translate.googleusercontent.com/translate_c?hl=es&ie=UTF-8&sl=es&tl=en&u=http://malicia.super.unam.mx/wiki/index.php/Llamadas_al_Sistema:_Directorios_y_Archivos&prev=_t&rurl=translate。 google.co.ve&twu = 1&usg = ALkJrhhwwFSx-UiPs4rtgSJADbrZy13v7A

4

3 に答える 3

2

私はあなたがこれを意味すると仮定しています:

(buf.st_dev & 0xFF00)>>8

それは比較ではありません。>>右シフト演算子です。第 1 オペランドを、第 2 オペランドで指定されたビット数だけ右にシフトします。この式は、buf.st_dev の 9 番目から 16 番目のビットを除くすべてをゼロにし (これが実行& 0xFF00されます)、結果の 8 ビットを 1 番目から 8 番目の最下位ビットにシフトします。これにより、0 から 255 までの数値が得られます。

于 2009-12-14T01:11:01.133 に答える
0

(buf.st_dev & 0xFF00)>>8, buf.st_dev & 0x00FF比較ではなく算術式です。

&オペランドのビットごとのバイナリ AND を実行します。

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

>>ビット単位のシフトを実行します

使用&は、ビットを別の値から「マスク」して、分離して検査できるようにする一般的な方法です。最初の式では、位置 8 ~ 15 の 8 ビットが分離され、位置 0 ~ 7 にシフトされるため、最下位から 2 番目のバイトが独立したバイトとして表示されるようになります。

2 番目の式はシフトを実行しません。これは、マスキング後に既に最下位のビット位置にあるためであり、直接意味があります。

于 2009-12-14T01:17:05.537 に答える
0

ここでは、stat や lstat などのコマンドに使用される stat 構造体にアクセスしようとしています。

struct stat {
     dev_t     st_dev;     /* ID of device containing file */
     ino_t     st_ino;     /* inode number */
     mode_t    st_mode;    /* protection */
     nlink_t   st_nlink;   /* number of hard links */
     uid_t     st_uid;     /* user ID of owner */
     gid_t     st_gid;     /* group ID of owner */
     dev_t     st_rdev;    /* device ID (if special file) */
     off_t     st_size;    /* total size, in bytes */
     blksize_t st_blksize; /* blocksize for file system I/O */
     blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
     time_t    st_atime;   /* time of last access */
     time_t    st_mtime;   /* time of last modification */
     time_t    st_ctime;   /* time of last status change */
 };

行の場合:

buf.st_mode & (0400>>i)

上記の構造の st_mode メンバーのビット 5 ~ 16 であるファイルのアクセス許可を抽出しようとしていると思います。

マクロ S_IFMT を使用して情報を抽出することもできると思います。

file_type = statbuf.st_mode&S_IFMT;  // for bits 1-4
file_perm = statbuf.st_mode&~S_IFMT  // for bits 5-16

開発者はあなたのスニペットで同じことを手動で行っており、 rwx または - を表示していると思います。

コードの st_dev 部分については、次のとおりです。

私は実際にそのメンバー変数を操作しようとしたことがないので、メンバーが何をしているのかはわかりません。見つける最善の方法は、 の定義を確認することですsys/types.h。使用の理由については、Laurence Gonsalves が説明しようとしているものと同じです。

マニュアル ページから確認できるのは、「st_ino フィールドと st_dev フィールドを合わせてシステム内のファイルを一意に識別する」という行だけです。

この情報がお役に立てば幸いです。

于 2009-12-14T01:54:31.840 に答える