Неверный файловый дескриптор

Я изучаю дескрипторы файлов и написал этот код:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int fdrd, fdwr, fdwt;
char c;

main (int argc, char *argv[]) {

    if((fdwt = open("output", O_CREAT, 0777)) == -1) {
        perror("Error opening the file:");
        exit(1);
    }

    char c = 'x';

    if(write(fdwt, &c, 1) == -1) {
        perror("Error writing the file:");
    }

    close(fdwt);
    exit(0);

}

, но я получаю: Error writing the file:: Bad file descriptor

Я не знаю, что может быть не так, так как это очень простой пример.


person Lucy    schedule 05.06.2011    source источник
comment
Каково значение fdwt при возврате из open()? Это должно быть небольшое целое число, например меньше 5. На самом деле, поскольку в этом коде не открыты другие fd, оно должно быть равно 3 (т. е. STDERR + 1).   -  person Pete Wilson    schedule 06.06.2011
comment
Кстати, в вашем коде есть несколько проблемных мест. Эти переменные не обязательно должны быть глобальными (немногие когда-либо делают это), вы должны объявить их в main. Вы также объявляете c дважды, вам не нужно char в char c во второй раз. В то же время второе объявление c в середине функции действительно только в C99, но вы объявляете main без типа возвращаемого значения, что недопустимо в C99, что устраняет неявное правило int, которое присутствовало в C89 и более ранние версии C. Большинство компиляторов должны выдавать предупреждения об этом, некоторые выдают ошибку и отказываются компилироваться.   -  person Nicholas Knight    schedule 06.06.2011
comment
Вы должны принять ответ!   -  person gsamaras    schedule 18.02.2015


Ответы (3)


Попробуй это:

open("output", O_CREAT|O_WRONLY, 0777)
person patapizza    schedule 05.06.2011
comment
Ух ты! Так быстро! :) Это сработало! Теперь я должен выяснить, почему! Большое спасибо! - person Lucy; 06.06.2011
comment
@Lucy - он дал вам дескриптор файла, поэтому открытие не завершилось ошибкой ... но дескриптор не подходил для записи. - person asveikau; 06.06.2011
comment
Не могли бы вы объяснить, почему требуется O_WRONLY и откуда берется 0777? - person PyWalker2797; 12.04.2020

Я думаю, что одного O_CREAT недостаточно. Попробуйте добавить O_WRONLY в качестве флага в команду открытия.

person RedX    schedule 05.06.2011

Согласно справочной странице open(2):

Флаги аргументов должны включать один из следующих режимов доступа: O_RDONLY, O_WRONLY или O_RDWR.

Так что да, как предложили другие, измените свой open на open("output", O_CREAT|O_WRONLY, 0777));. Используйте O_RDWR, если вам нужно прочитать из файла. Вы также можете захотеть O_TRUNC -- подробности смотрите на справочной странице.

person spacehunt    schedule 05.06.2011