Добрый день!!
Помогите разобраться, значит дело вот в чём, выполняю процесс копирования файла:
fd_inp = open(srcFile, O_RDONLY);
fd_outp= creat(name_to_try.latin1(), 0666);
//... копирую, и потом:
close(fd_outp);close(fd_inp);
Здесь программа падает, и получает сигнал 11 (SIGSEGV), прямо-таки полтергейст.
При этом следующая вещь, программа падает, только если выполняю 2 раза close(). То есть выполняю close(fd1), всё нормально, а потом close(fd2) -- падение.
Файл сам копируется, но закрыть дескриптор не получается.
Подскажите, пожалуйста, как посмотреть сколько открытых файлов привязанно к процессу??
при выполнении close(fd) 2 раза программа падает?! (непонятный случай)
Модератор: Модераторы разделов
-
some one else
- Сообщения: 24
Re: при выполнении close(fd) 2 раза программа падает?!
Добрый день!!
Вот понял, что вот в чём собака порылась (либо так мне кажется) -- в includax программы написано использовать функции из пакета QWidget.
В этом пактете есть такая функция -- close(), и компилятор её подставляет в участке кода, где мне думалось что подставляю close() из syscalls.
такой конфуз вышел
Как это обнаружилось -- написал close(fd1,fd2);
на это компилятор говорит --
/usr/lib/qt3//include/qwidget.h:826: note: candidates are: bool QWidget::close()
/usr/lib/qt3//include/qwidget.h:373: note: virtual bool QWidget::close(bool)
Уважаемые Гуру, подскажите, что надо написать перед close(), для того чтобы компилятор её поставил из syscalls??
За ранее благодарен.
Вот понял, что вот в чём собака порылась (либо так мне кажется) -- в includax программы написано использовать функции из пакета QWidget.
В этом пактете есть такая функция -- close(), и компилятор её подставляет в участке кода, где мне думалось что подставляю close() из syscalls.
Как это обнаружилось -- написал close(fd1,fd2);
на это компилятор говорит --
/usr/lib/qt3//include/qwidget.h:826: note: candidates are: bool QWidget::close()
/usr/lib/qt3//include/qwidget.h:373: note: virtual bool QWidget::close(bool)
Уважаемые Гуру, подскажите, что надо написать перед close(), для того чтобы компилятор её поставил из syscalls??
За ранее благодарен.
-
oav
- Бывший модератор
- Сообщения: 296
Re: при выполнении close(fd) 2 раза программа падает?!
some one else писал(а): ↑13.11.2005 15:34Добрый день!!
Вот понял, что вот в чём собака порылась (либо так мне кажется) -- в includax программы написано использовать функции из пакета QWidget.
В этом пактете есть такая функция -- close(), и компилятор её подставляет в участке кода, где мне думалось что подставляю close() из syscalls.такой конфуз вышел
Как это обнаружилось -- написал close(fd1,fd2);
на это компилятор говорит --
/usr/lib/qt3//include/qwidget.h:826: note: candidates are: bool QWidget::close()
/usr/lib/qt3//include/qwidget.h:373: note: virtual bool QWidget::close(bool)
Уважаемые Гуру, подскажите, что надо написать перед close(), для того чтобы компилятор её поставил из syscalls??
За ранее благодарен.
mm...may be ::close?
-
some one else
- Сообщения: 24
Re: при выполнении close(fd) 2 раза программа падает?!
mm...may be ::close?
Да, такую тему пробывал, компилятор сказал, что не понял.
-
Zmoukie
- Сообщения: 29
Re: при выполнении close(fd) 2 раза программа падает?!
Хм, почему компилятор говорит что кандидаты
bool QWidget::close()
virtual bool QWidget::close(bool), ведь ты передаешь в close int, а из предложенных вариантов есть только функция ничего не принимающая и принимающая bool.
Попробуй так:
close((int)fd_inp);
или
close(static_cast<int>(fd_inp));
или int result = close((int)fd_inp); чтоб наверняка
bool QWidget::close()
virtual bool QWidget::close(bool), ведь ты передаешь в close int, а из предложенных вариантов есть только функция ничего не принимающая и принимающая bool.
Попробуй так:
close((int)fd_inp);
или
close(static_cast<int>(fd_inp));
или int result = close((int)fd_inp); чтоб наверняка
-
some one else
- Сообщения: 24
Re: при выполнении close(fd) 2 раза программа падает?!
Хм, почему компилятор говорит что кандидаты
bool QWidget::close()
virtual bool QWidget::close(bool), ведь ты передаешь в close int, а из предложенных вариантов есть только функция ничего не принимающая и принимающая bool.
Проблема, компилятор, всё равно подставляет QWidget::close(), и никак не мотивирует, что в скобках написано int. Хотя в .h файле для QWidget::close, так и написано:
bool close();
Попробуй так:
close((int)fd_inp);
или
close(static_cast<int>(fd_inp));
или int result = close((int)fd_inp); чтоб наверняка
Спасибо за советы.
Многоуважаемые ГУРУ!! Не ужели такой проблемы ни у кого не возникало??
-
some one else
- Сообщения: 24
Re: при выполнении close(fd) 2 раза программа падает?!
Решение найдено, правда оно немного кривовато, но работает:
syscall(__NR_close,fd);
Правда, я не kernelhacker, и поэтому должен избегать обращения к syscall. Прошу меня здесь простить.
"__NR_close" определён в "asm/unistd.h". Так что вот такие заморочки. Не знаю как это будет на архитектуре отличной от x86. Хотя, как говорится -- how cares?!
Ребята, у кого есть процессор на ПК отличный от x86 архитектуры??
Не дай Бог никому таких глюк с одноименными функциями.
-
d_Sun
- Сообщения: 291
Re: при выполнении close(fd) 2 раза программа падает?!
some one else писал(а): ↑15.11.2005 23:42Решение найдено, правда оно немного кривовато, но работает:
Да уж... Полный текст проги в студию!
Моя подпись сильно длинная :)
-
Zmoukie
- Сообщения: 29
Re: при выполнении close(fd) 2 раза программа падает?!
Проблема, компилятор, всё равно подставляет QWidget::close(), и никак не мотивирует, что в скобках написано int. Хотя в .h файле для QWidget::close, так и написано:
bool close();
Да не может такого быть! Как ты себе это представляешь? Если компилятор не находит перегруженной функции подходящей под данный вызов, он должен сообщать об ошибке а не подставлять какую-то левую функцию. Поставь breakpoint на вызове функции и посмотри в отладчике что он там вызывает. И вообще, код в студию
-
oav
- Бывший модератор
- Сообщения: 296
Re: при выполнении close(fd) 2 раза программа падает?!
Zmoukie писал(а): ↑16.11.2005 12:39Проблема, компилятор, всё равно подставляет QWidget::close(), и никак не мотивирует, что в скобках написано int. Хотя в .h файле для QWidget::close, так и написано:
bool close();
Да не может такого быть! Как ты себе это представляешь? Если компилятор не находит перегруженной функции подходящей под данный вызов, он должен сообщать об ошибке а не подставлять какую-то левую функцию. Поставь breakpoint на вызове функции и посмотри в отладчике что он там вызывает. И вообще, код в студию
может для какого-то будет открытие, но по возращаемому значение перегрузки не бывает
-
d_Sun
- Сообщения: 291
Re: при выполнении close(fd) 2 раза программа падает?!
Дык обратное вроде никто и не утверждает
Моя подпись сильно длинная :)
-
Zmoukie
- Сообщения: 29
Re: при выполнении close(fd) 2 раза программа падает?!
oav, кто-то предлагает перегружать по возвращаемому значению? сначала читаем, потом отвечаем, а не наоборот 
-
oav
- Бывший модератор
- Сообщения: 296