Как с помощью stat() определить, является ли файл символической ссылкой?

По сути, мне нужно написать клон команды UNIX ls для класса, и у меня почти все работает. Одна вещь, которую я не могу понять, как это сделать, это проверить, является ли файл символической ссылкой или нет. На справочной странице для stat() я вижу, что там определено значение mode_t, S_IFLNK.

Вот как я пытаюсь проверить, является ли файл символической ссылкой, но безуспешно (обратите внимание, stbuf - это буфер, в который stat() вернул данные inode):

switch(stbuf.st_mode & S_IFMT){
    case S_IFLNK:
        printf("this is a link\n");
        break;
    case S_IFREG:
        printf("this is not a link\n");
        break;
}

Мой код ВСЕГДА печатает this is not a link, даже если это так, и я точно знаю, что указанный файл является символической ссылкой, так как фактическая команда ls так говорит, плюс я создал символическую ссылку...

Может ли кто-нибудь заметить, что я могу делать неправильно? Спасибо за помощь!


person hora    schedule 14.04.2010    source источник
comment
Цитата из моей справочной страницы stat(2): lstat() идентична stat(), за исключением того, что если путь является символической ссылкой, то указывается сама ссылка, а не файл, на который она ссылается.   -  person Philip    schedule 15.04.2010


Ответы (1)


Вы не можете.

Вам нужно использовать lstat() для определения самой ссылки, обычный stat() будет следовать по ссылке и, таким образом, никогда не «увидит» саму ссылку.

person unwind    schedule 14.04.2010
comment
Так зачем тогда использовать команду stat()? Я только что попробовал использовать lstat(), и похоже, что он предоставляет ту же информацию, за исключением того, что он обрабатывает ссылки. Вы бы использовали stat() только тогда, когда знаете, что не имеете дело с символическими ссылками? - person hora; 14.04.2010
comment
Вы также используете его при работе с символическими ссылками, часто вам все равно, является ли путь обычным файлом или ссылкой, вам важен используемый файл. Например, mtime для ссылки совершенно неинтересно, mtime для файла, на который указывает ссылка. - person wich; 14.04.2010
comment
stat() обрабатывает ссылки, он просто обрабатывает их по-другому - он переходит по ссылке и сообщает вам о файле, на который она указывает (что, как видно, часто является тем, что вам нужно). - person caf; 14.04.2010
comment
Вы используете stat(), когда хотите, чтобы ссылки вели себя как обычно, то есть как файл, на который они указывают. Только приложения, которым необходимо различать ссылки и не ссылки, должны использовать lstat(). - person unwind; 14.04.2010