2016-11-12 2 views
0

Моя ОС - Linux. Я программирую на C. Я знаю, что я могу использовать lstat() для распознавания софт-ссылки, т. Е. Использовать S_ISLNK (st.st_mode). Но как я могу узнать, что ссылка - жесткая ссылка? если ссылка является жесткой ссылкой, она будет считаться обычным файлом. Тем не менее, я также хочу отличить обычный файл от жесткой ссылки. Есть ли способы справиться с этим делом?как использовать lstat(), чтобы определить, есть ли жесткая ссылка или нет.

+0

Конечно, если это не мягкая ссылка, то она должна быть жесткая связь? –

+0

Обычный файл * есть * жесткая ссылка. – wildplasser

ответ

2

Но как я могу узнать, что ссылка жесткая ссылка?

Вы не можете.

«Жесткая ссылка» на самом деле не является чем-то особенным. Это просто запись в каталоге, которая указывает на то же данные на диске, что и запись каталога в другом месте. только способ достоверно идентифицировать жесткие ссылки - это сопоставить все пути вашей файловой системы к inodes, а затем посмотреть, какие из них указывают на то же значение.

0

struct stat имеет член st_nlink для количества жестких ссылок. Это> 1, файл указывается в одной из жестких ссылок на фактическое содержимое файла.

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 */ 
}; 

Вот пример программы:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
int main() 
{ 
    struct stat buf = {0}; 
    lstat("origfile", &buf); 
    printf("number of hard links for origfile: %d\n", buf.st_nlink); 
} 

выход:

$ touch origfile 
$ ./a.out 
number of hard links for origfile: 1 
$ ln origfile hardlink1 
$ ./a.out 
number of hard links for origfile: 2 
$ ln origfile hardlink2 
$ ./a.out 
number of hard links for origfile: 3 
Смежные вопросы