4

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

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变量进行比较,但它不起作用。我也试过这个链接

将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
...
4

3 回答 3

2

nlink_t是 typedef'd 作为整数类型(例如,unsigned shortunsigned int),因此您应该能够强制stat.st_nlink转换为一个unsignedunsigned long没有编译器抱怨。

您的parse_to_int()函数不正确,因为您将指针 ( nlink_t*) 转换为unsigned int,而不是nlink_t变量的值。但是您不需要该功能,只需正确使用强制转换即可。

附录

还要确保您没有将无符号类型与进行比较-1,这会给您带来意想不到的结果。

于 2013-04-12T17:09:14.983 回答
1

所以我有几个问题:

  1. stat如果路径以结尾,则无法从文件中获取/
  2. 您计算机的文件夹列表中有一些文件夹是由您的操作系统创建的。内存中的某种数据,解释为文件夹和文件(称为虚拟文件系统)。所以如果你试图i-node从这种文件中获取数字,你会得到一些垃圾值。
于 2013-04-14T14:07:39.813 回答
0

您应该能够与 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。

于 2013-04-12T17:11:38.843 回答