2016-03-15 4 views
-2

Im работает над программой, которая получает файл через аргумент и возвращает его информацию и имя. Im получение ошибки Плохое описание файла. Мой код выглядит следующим образом:bad file descriptor C

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <time.h> 

int main(int argc, char *argv[]){ 
    if(argc < 2){ 
     printf("Error"); 
     return 1; 
    } 
    else 
    { 
     int i; 
     for(i=1;i<argc;i++) 
     { 
      int file = 0; 
      file = open(argv[i], O_RDONLY); 
      if(file == -1) 
      { 
       close(file); 
       return 1; 
      } 
      else 
      { 
       struct stat info; 
       if(fstat(file, &info) < 0) 
       { 
        close(file); 
        return 1; 
       } 
       else 
       { 
        printf("Status information for %s\n",argv[i]); 
        printf("Size of file: %d \n", info.st_size); 
        printf("Number of connections: %d\n", info.st_nlink); 
        printf("inode: %d\n", info.st_ino);     
        printf("Last used : %s", ctime(&info.st_atime)); 
        printf("Last change : %s", ctime(&info.st_mtime)); 
        printf("Last status of change : %s", ctime(&info.st_ctime)); 
        printf("ID owner : %d\n", info.st_uid); 
        printf("ID group : %d\n", info.st_gid); 
        printf("ID device : %d\n", info.st_dev); 
        printf("Security : :"); 
        printf((S_ISDIR(info.st_mode)) ? "d" : "-"); 
        printf((info.st_mode & S_IRUSR) ? "r" : "-"); 
        printf((info.st_mode & S_IWUSR) ? "w" : "-"); 
        printf((info.st_mode & S_IXUSR) ? "x" : "-"); 
        printf((info.st_mode & S_IRGRP) ? "r" : "-"); 
        printf((info.st_mode & S_IWGRP) ? "w" : "-"); 
        printf((info.st_mode & S_IXGRP) ? "x" : "-"); 
        printf((info.st_mode & S_IROTH) ? "r" : "-"); 
        printf((info.st_mode & S_IWOTH) ? "w" : "-"); 
        printf((info.st_mode & S_IXOTH) ? "x" : "-"); 
        if(S_ISREG(info.st_mode)){ 
         printf("\nFile is regular\n"); 
        } 
        else if(S_ISDIR(info.st_mode)){ 
         printf("\nFile is a directory\n"); 
        } 
        printf("\n===================================\n"); 
        close(file); 

       } 
      } 
     } 
    } 
    return 0; 
} 

Когда я запускаю программу, как это, например: ./program я некий-файл это получить в ответ -> Плохой дескриптор файла

+1

попробовать прибегая к помощи первому, прежде чем прийти сюда, есть тонны ответивших там – redFIVE

+3

Если 'open' терпит неудачу, то почему бы вам попробовать' close' результат? Он возвращает только -1 при ошибке, потому что _can't_ является допустимым файловым дескриптором, поэтому _cannot_ будет действительным для 'закрытия'. – Useless

+1

Где вы видите эту ошибку? –

ответ

2

Проблема здесь:

 file = open(argv[i], O_RDONLY); 
     if(file == -1) 
     { 
      close(file); 
      return 1; 
     } 

потому что, когда file==-1, это недействительный файловый дескриптор для перехода на close.

Вы можете убедить себя, что это нормально не называть close в этой отрасли, потому что если open не удалось, там не ничего close в первую очередь.

Как и в сторону, close также имеет возвращаемое значение, и оба open и close установить errno, если они не вы можете проверить, и войти, все из них. Тот факт, что почти весь код заканчивается проверкой/обработкой ошибок, является одним из мотивов для других языков (например, C++), вводящих исключения.

int file = open(argv[i], O_RDONLY); 
if(file == -1) { 
    perror("open failed"); 
    return 1; 
} 
struct stat info; 
if (fstat(file, &info) < 0) { 
    perror("fstat failed"); 
    if (close(file) < 0) { 
     perror("close failed"); 
    } 
    return 1; 
} 
Смежные вопросы