2016-05-10 4 views
-1

Если я использую функцию stat, чтобы получить stat структуры, st_ino совпадает с номером i-узла с ls -i.Confused with st_ino?

1305609 
[[email protected] chapter-four]$ ls -i 
1305607 a.txt 1305606 fstatat.bin 1305609 fstatat.c 1305605 tmp.txt 

ЬиЕ, если я использую функцию fstat, то st_ino всегда 4195126.

кто-нибудь может сказать мне, почему это происходит?

+0

Параметр 'open' называют, что вы закомментирована неправильно; вторым параметром должны быть подходящие флаги, а не строка. Также, пожалуйста, напишите полный код, показывающий, как вы используете 'fstat'. – davmac

ответ

2

Проблема в том, что вы не используете open правильно и не проверяете возвращаемые значения для ошибок. Таким образом, вы затем вызвать fstat на недопустимом значении дескриптора файла -1 возвращенного open на ошибке, которая также потерпит неудачу и не трогать buf на всех, так неинициализированный мусор в структурах по-прежнему существует (4195126, шестигранный 0x400336 пахнет много, как у обратный адрес предыдущего вызова функции еще находится в стеке или что-то вроде этого.)

Как уже указывалось davmac, вторым параметром open должен быть список флагов, которые являются числовыми. Проверьте docs.

Таким образом, правильный код будет:

#include "stdio.h" 
#include <sys/stat.h> 
#include <sys/fcntl.h> // for the O_RDONLY constant 
#include <errno.h> // for error output 


int main(int argc, char *argv[]) { 
    struct stat buf; 
    int fd = open("./fstatat.c", O_RDONLY); 
    if(fd == -1) { 
     printf("Error calling open: %s\n", strerror(errno)); 
    } else { 
     if(fstat(fd, &buf) == -1) { 
      printf("Error calling fstat: %s\n", strerror(errno)); 
     } else { 
      printf("%d\n", buf.st_ino); 
      if(close(fd) == -1) { 
       printf("Error calling close: %s\n", strerror(errno)); 
      } 
     } 
    } 
    return 0; 
} 
+0

ой, thx, я был так небрежен. –