【问题标题】:How to compare nlink_t to int如何将 nlink_t 与 int 进行比较
【发布时间】:2013-04-05 06:31:27
【问题描述】:

我在 Linux 上使用stat 系统调用并检索文件信息。

char *parent_dir; // for example: /run/atd.pid/
struct stat buf;
stat(parent_dir, &buf);

buf结构类型:

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_nlink

我的问题是我无法将硬链接的数量与整数值进行比较。我尝试初始化另一个 nlink_t,然后将我的变量与 stat 变量进行比较,但它不起作用。我也试过这个link

nlink_t 转换为 int 的另一种方法,但它不起作用。总是返回相同的数字。

int
parse_to_int(nlink_t *source)
{
  int buffer_size = sizeof(*source);
  char buffer[buffer_size];
  snprintf(&buffer[0], buffer_size, "%lu", (unsigned long)source);
  int val = atoi(buffer);
  return val;
}

有什么想法吗?

我使用parse_to_int函数时的程序输出:

get stat for: /run/nm-dhclient-wlan0.conf/ 
nlink_t: 321
get stat for: /run/wpa_supplicant/ 
nlink_t: 321
get stat for: /run/udisks2/ 
nlink_t: 321
get stat for: /run/nm-dns-dnsmasq.conf/ 
nlink_t: 321
...

【问题讨论】:

  • 你不能将 nlink_t 类型转换为 int 并使用它吗?还是有其他事情妨碍?失败案例的来源可能有助于解决问题。
  • 代码没有失败。如果我尝试获取 link 中描述的值,它总是返回一个数字。
  • @gkiko:我不明白这种行为。请展示一个显示问题的最小程序。
  • 我已经编辑了问题

标签: c file parsing variables


【解决方案1】:

所以我遇到了几个问题:

  1. 如果路径以/ 结尾,则无法从文件中获取stat
  2. 您的计算机文件夹列表中有一些文件夹是由您的操作系统创建的。内存中的某种数据,解释为文件夹和文件(称为virtual file-system)。因此,如果您尝试从此类文件中获取 i-node 编号,您会得到一些垃圾值。

【讨论】:

    【解决方案2】:

    您应该能够与 uint 进行比较。如果您有超过 64k 的硬链接,我会感到惊讶。

    试图根据 nlink_t 的长度来猜测打印 nlink_t 的字符串表示所需的大小是一个错误。 nlink_t 可能是 8 个字节,但 4000000000 是超过 8 个字节的数字打印出来的。

    找到正确大小的正确方法是检查 snprintf 的返回值,它会告诉您实际需要多大的缓冲区(或者您可以平底船并分配大于 8 的东西。 sizeof(*source)不是一个可靠的解决方案。

    int size = snprintf(NULL, 0, "%lu", (unsigned long)source);
    buffer = new chara[size + 1]; //+1 for a NULL
    int size = snprintf(buffer, size, "%lu", (unsigned long)source);    
    

    此外,除非您的文件系统发生变化,否则硬链接的数量应该保持一致。看看

    的输出
    tmp]$ ls -ld /home/
    drwxr-xr-x. 5 root root 4096 Feb  3  2012 /home/
    

    所有者前面的数字是硬链接的数量,在本例中为 5。

    【讨论】:

      【解决方案3】:

      nlink_t 被定义为整数类型(例如,unsigned shortunsigned int),因此您应该能够将stat.st_nlink 转换为unsignedunsigned long 而不会引起编译器的抱怨。

      您的 parse_to_int() 函数不正确,因为您将指针 (nlink_t*) 转换为 unsigned int,而不是 nlink_t 变量的值。但是你不需要这个函数,只要正确使用演员表即可。

      附录

      还要确保您没有将 unsigned 类型与 -1 进行比较,这会产生意想不到的结果。

      【讨论】:

      • 问题是我在以 / 结尾的文件上调用了stat。但我仍然有溢出问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多