Непонятная ошибка при закрытии дескриптора файла
От: skl  
Дата: 28.09.14 11:27
Оценка:
1) Непонятная проблема происходит при закрытии дескриптора файла (открытого файла на чтение) в коде на C++ ниже (ОС Linux). Это метод класса, который
вызывается периодически по таймеру. Если я вставляю в конце этой функции close(barcode_fd), то программа падает в segmentation fault, а если оставляю без оператора close, то программа работает правильно, но в системе со временем исчерпываются все дескрипторы файлов, что очевидно, т. к. они не закрываются в программе.

Буду благодарен, если кто подскажет почему close() не хочет закрывать дескриптор и как это сделать правильно?

(Наличие или отсутствие флага O_NONBLOCK никак не влияет на решение проблемы, т. е. все точно также как я описал, то же самое с любым текстовым файлом, не обязательно /dev/ttyACM0.)

2) Я понимаю, что это скорее сишный код в методе, но я не знаю как с помощью файловых потоков С++ задать неблокируемый режим для файла на чтение (т. е. флаг O_NONBLOCK). Буду благодарен за подсказку как это сделать при помощи файловых потоков С++.

int FromFtpForm::getBarcode()
{
    int barcode_fd;
    char buf_barcode[150];

    barcode_fd = open("/dev/ttyACM0", O_RDONLY| O_NONBLOCK);
    if (barcode_fd < 0) return -1;

   for (int i=0; i<150; i++) buf_barcode[i] = '\0';

    read(barcode_fd, buf_barcode, sizeof(buf_barcode));

    close(barcode_fd); // Если этот убрать, то программа работает, если оставить, то падает

    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.