при выполнении close(fd) 2 раза программа падает?! (непонятный случай)

Модератор: Модераторы разделов

Аватара пользователя
some one else
Сообщения: 24

при выполнении close(fd) 2 раза программа падает?!

Сообщение some one else »

Добрый день!!
Помогите разобраться, значит дело вот в чём, выполняю процесс копирования файла:

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) -- падение.
Файл сам копируется, но закрыть дескриптор не получается.

Подскажите, пожалуйста, как посмотреть сколько открытых файлов привязанно к процессу??
Спасибо сказали:
Аватара пользователя
some one else
Сообщения: 24

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение some one else »

Добрый день!!
Вот понял, что вот в чём собака порылась (либо так мне кажется) -- в includax программы написано использовать функции из пакета QWidget.
В этом пактете есть такая функция -- close(), и компилятор её подставляет в участке кода, где мне думалось что подставляю close() из syscalls. :wacko: такой конфуз вышел

Как это обнаружилось -- написал 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 раза программа падает?!

Сообщение oav »

some one else писал(а):
13.11.2005 15:34
Добрый день!!
Вот понял, что вот в чём собака порылась (либо так мне кажется) -- в includax программы написано использовать функции из пакета QWidget.
В этом пактете есть такая функция -- close(), и компилятор её подставляет в участке кода, где мне думалось что подставляю close() из syscalls. :wacko: такой конфуз вышел

Как это обнаружилось -- написал 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?
:rolleyes:
Спасибо сказали:
Аватара пользователя
some one else
Сообщения: 24

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение some one else »

mm...may be ::close?
:rolleyes:


Да, такую тему пробывал, компилятор сказал, что не понял.
Спасибо сказали:
Zmoukie
Сообщения: 29

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение Zmoukie »

Хм, почему компилятор говорит что кандидаты
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 раза программа падает?!

Сообщение some one else »

Хм, почему компилятор говорит что кандидаты
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 раза программа падает?!

Сообщение some one else »

:D

Решение найдено, правда оно немного кривовато, но работает:

syscall(__NR_close,fd);

Правда, я не kernelhacker, и поэтому должен избегать обращения к syscall. Прошу меня здесь простить.
"__NR_close" определён в "asm/unistd.h". Так что вот такие заморочки. Не знаю как это будет на архитектуре отличной от x86. Хотя, как говорится -- how cares?!
Ребята, у кого есть процессор на ПК отличный от x86 архитектуры??

Не дай Бог никому таких глюк с одноименными функциями.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение d_Sun »

some one else писал(а):
15.11.2005 23:42
Решение найдено, правда оно немного кривовато, но работает:


Да уж... Полный текст проги в студию!
Моя подпись сильно длинная :)
Спасибо сказали:
Zmoukie
Сообщения: 29

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение Zmoukie »

Проблема, компилятор, всё равно подставляет QWidget::close(), и никак не мотивирует, что в скобках написано int. Хотя в .h файле для QWidget::close, так и написано:
bool close();


Да не может такого быть! Как ты себе это представляешь? Если компилятор не находит перегруженной функции подходящей под данный вызов, он должен сообщать об ошибке а не подставлять какую-то левую функцию. Поставь breakpoint на вызове функции и посмотри в отладчике что он там вызывает. И вообще, код в студию :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение oav »

Zmoukie писал(а):
16.11.2005 12:39
Проблема, компилятор, всё равно подставляет QWidget::close(), и никак не мотивирует, что в скобках написано int. Хотя в .h файле для QWidget::close, так и написано:
bool close();


Да не может такого быть! Как ты себе это представляешь? Если компилятор не находит перегруженной функции подходящей под данный вызов, он должен сообщать об ошибке а не подставлять какую-то левую функцию. Поставь breakpoint на вызове функции и посмотри в отладчике что он там вызывает. И вообще, код в студию :)


может для какого-то будет открытие, но по возращаемому значение перегрузки не бывает
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение d_Sun »

oav писал(а):
16.11.2005 12:54
может для какого-то будет открытие, но по возращаемому значение перегрузки не бывает


Дык обратное вроде никто и не утверждает ;)
Моя подпись сильно длинная :)
Спасибо сказали:
Zmoukie
Сообщения: 29

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение Zmoukie »

oav, кто-то предлагает перегружать по возвращаемому значению? сначала читаем, потом отвечаем, а не наоборот :)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: при выполнении close(fd) 2 раза программа падает?!

Сообщение oav »

Zmoukie писал(а):
16.11.2005 13:13
oav, кто-то предлагает перегружать по возвращаемому значению? сначала читаем, потом отвечаем, а не наоборот :)

ок ок посыпаю голову пеплом :rolleyes:
Спасибо сказали: