read() возвращает неверный файловый дескриптор для допустимого файлового дескриптора.

В следующей программе,

int main()
{
    int fd;
    char buf[8]={};

    remove("file.txt");
    fd = creat("file.txt",0666);
    write(fd,"asdf",5);
    perror("write");
    lseek(fd,0,SEEK_SET);
    perror("lseek");
    read(fd,buf,5);
    perror("read");
    printf("%s\n",buf);
    return 0;
}

Мой ожидаемый результат

write : Success
lseek : Success
Read : Success
asdf

Но это показывает

wriet : Success
lseek : Success
Read : Bad file descriptor

Кто-нибудь может сказать мне причину? Я вижу, что строка "asdf" успешно записана в file.txt


person Ajith C Narayanan    schedule 17.01.2019    source источник
comment
Пожалуйста, помните, что вы должны вызывать perror() только в том случае, если что-то действительно не удалось. Если бы read() не завершился ошибкой, вы могли бы напечатать ошибку, связанную с кодом, который вы запускали до вызова read().   -  person nos    schedule 17.01.2019


Ответы (1)


Из справочной страницы:

Функция creat() должна вести себя так, как если бы она была реализована следующим образом:

int creat(const char *path, mode_t mode)
{
    return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
}

Итак, файл открыт в режиме только для записи и, следовательно, вы не можете читать.

Если вам нужно читать и писать, используйте open(...) напрямую с O_RDWR вместо O_WRONLY.

Указанный вами 0666 просто указывает разрешения в файловой системе, с которой создается файл.

Если вы просто хотите выполнять обычный файловый ввод-вывод, вы также можете использовать API высокого уровня, такие как fopen.

person ThiefMaster    schedule 17.01.2019
comment
0666 означает, что все пользователи могут читать и писать, но не могут выполнять - person Ajith C Narayanan; 17.01.2019
comment
Вы смешиваете разрешения файловой системы с режимами файлов. 0666 означает, что любой пользователь может читать/записывать файл, но это не означает, что дескриптор файла в вашем коде может это делать. - person ThiefMaster; 17.01.2019