unix中的系统调用:目录和文件

时间:2009-12-14 01:03:55

标签: c unix file directory system-calls

嗨,我正在尝试理解系统调用: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

链接显示整个代码示例1,名为estado.c

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

3 个答案:

答案 0 :(得分:2)

我假设你是这个意思:

(buf.st_dev & 0xFF00)>>8

这不是比较。 >>是右移运营商。它将第一个操作数向右移动第二个操作数指定的位数。除了buf.st_dev的第9位到第16位(这是& 0xFF00所做的)之外,该表达式都归零,然后将得到的8位向下移位到第1到第8个最低有效位。这将导致0到255之间的数字。

答案 1 :(得分:0)

(buf.st_dev & 0xFF00)>>8, buf.st_dev & 0x00FF不是比较,而是算术表达式:

&执行操作数的按位二进制AND:

0&amp; 0 = 0
  0&amp; 1 = 0
  1&amp; 0 = 0
  1&amp; 1 = 1

>>执行按位移位

使用&是从另一个值中“掩盖”位的常用方法,因此可以单独检查它们。在第一个表达式中,位置8到15中的8位被隔离并移位到位置0到7,因此就好像第二个到最低有效字节显示为独立字节。

第二个表达式不执行移位,因为在屏蔽之后它已经处于最低位位置,因此直接有意义。

答案 2 :(得分:0)

我们正在尝试访问用于命令的stat struscture,例如stat和lstat:

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字段一起唯一标识系统中的文件。”

希望这些信息有助于你。