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