Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Можно ли использовать дескриптор в качестве индекс


Автор: andrew_121 13.12.2009, 17:40
Привет.

Суть вопроса вот в чем: Мониторю события на дескрипторах при помощи epoll. Так вот интересует, можно ли дескрипторы использовать в качестве индекса?
Код

const int N = 10000;

struct any_descriptor_information {
...
...
};
...

/** alloc on start programm */
struct any_descriptor_information** descriptors_array = (struct any_descriptor_information**)malloc(N*sizeof(struct any_descriptor_information*));
memset(descriptors_array, 0, N*sizeof(struct any_descriptor_information*));
...

void on_any_event_on_descriptor(int fd, ...) {
   any_descriptor_information* current = descriptors_array[fd];
   if ( current ) {
      /** descriptor already initialized */
   }
}

попробовал ради эксперимента, пока работает. Только вот не понятно, насколько это безопасно?

Автор: MAKCim 13.12.2009, 17:44
Цитата(andrew_121 @  13.12.2009,  17:40 Найти цитируемый пост)
Только вот не понятно, насколько это безопасно? 

совсем не безопасно ;)

Автор: GwinnBleidd 13.12.2009, 19:47
а когда значение дескриптора станет больше 10000 что будешь делать?   smile 
возможный диапазон-то огого smile

Автор: Lazin 13.12.2009, 20:25
Цитата(andrew_121 @  13.12.2009,  17:40 Найти цитируемый пост)
попробовал ради эксперимента, пока работает. Только вот не понятно, насколько это безопасно?

открой для себя хэш таблицы smile 

Автор: andrew_121 13.12.2009, 21:09
MAKCim, 
GwinnBleidd, Я вот из каких соображений исхожу - зная что нумеровка дескрипторов в программе, начинается с 3(из-за stdin, stdout, stderr), экспериментальным способом установил, что если открыть файл, его дескриптор равен 3, если открыть еще один файл, 4. Но если закрыть файл у которого дескриптор == 3, и после открыть его опять, то его дескриптор опять равен 3. Из этого предположил, что дескрипторы выделяются не каким-то случайным образом, и ОС оптимизирует этот механизм. И если в программе нет утечки дескрипторов, то принцип выделения их, весьма предсказуем и стабилен.

А вообще, было бы интересно узнать/почитать, по какому принципу Linux/BSD выделяют дескрипторы?

п.с.
Цитата(GwinnBleidd @  13.12.2009,  19:47 Найти цитируемый пост)
а когда значение дескриптора станет больше 10000 что будешь делать?   smile 
возможный диапазон-то огого smile

Если программа не открыла 10000 дескрипторов, то диапазон == сколько_открыто + 3

Автор: andrew_121 13.12.2009, 21:30
UP.
Я полагаю, что с момента выделения дескриптора, до его освобождения, его все же можно использовать в качестве индекса. Но не уверен. В общем, интересует мнение остальных.
И все же это ради эксперимента.

Автор: Lazin 13.12.2009, 21:53
Цитата(andrew_121 @  13.12.2009,  21:30 Найти цитируемый пост)
Я полагаю, что с момента выделения дескриптора, до его освобождения, его все же можно использовать в качестве индекса. Но не уверен. В общем, интересует мнение остальных.
И все же это ради эксперимента.
  • это непереносимо, нет гарантии что со следующей версией ядра это по прежнему будет работать
  • твоя программа будет падать после того, как будет открыто 10000 дескрипторов, даже если они будут открыты не одновременно, представь, что ты пишешь клиент серверное приложение подключился один клиент, затем отключился, потом подключился второй клиент, затем он то-же отключился, рано или поздно значение дескриптора перевалит через 10000 и твоя программа упадет
  • существуют нормальные способы делать это,  вообще должна быть возможность привязать любые данные к асинхронной операции, по крайней мере ASIO это как-то делает, в этом случае необходимость в поиске по индексу вообще отпадает
  • существуют хэш таблицы
  • существуют бинарные деревья поиска

Автор: MAKCim 13.12.2009, 22:07
andrew_121,
если ты используешь epoll, то epoll_event содежит поле data.ptr и с конкретным event'ом ты можешь связать объект, который будет хранить дескриптор

Добавлено через 12 минут и 14 секунд
Цитата(andrew_121 @  13.12.2009,  21:09 Найти цитируемый пост)
А вообще, было бы интересно узнать/почитать, по какому принципу Linux/BSD выделяют дескрипторы?

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/file.h#L39

Автор: fry 13.12.2009, 22:33
У Стивенса в "UNIX разработка сетевых приложений" дескрипторы используются в примере как индексы, однако попытки запуска примера под виндой говорят о том, что описанный вариант является непереносимым по причине х.н знает какого алгоритма выделения значения дескриптора (ИМХО просто рандом полнейший).

Автор: andrew_121 13.12.2009, 22:47
Цитата(Lazin @  13.12.2009,  21:53 Найти цитируемый пост)
это непереносимо, нет гарантии что со следующей версией ядра это по прежнему будет работать

 smile 


Цитата(Lazin @  13.12.2009,  21:53 Найти цитируемый пост)
твоя программа будет падать после того, как будет открыто 10000 дескрипторов, даже если они будут открыты не одновременно, представь, что ты пишешь клиент серверное приложение подключился один клиент, затем отключился, потом подключился второй клиент, затем он то-же отключился, рано или поздно значение дескриптора перевалит через 10000 и твоя программа упадет

Я же описал, что после освобождения дескриптора, если вновь открыть файл, то он получит дескриптор с тем же номером. Т.е. если клиент отключился, дескриптор освободился, так же освобождаются все связанные с ним данные, т.е. сессия с этим клиентом завершена. Конечно, позже он может опять же подключиться, с ним будет начата новая сессия, соответственно, и новый дескриптор. Но я говорю только об одной не прерываемой сессии.


Цитата(Lazin @  13.12.2009,  21:53 Найти цитируемый пост)
# существуют нормальные способы делать это,  вообще должна быть возможность привязать любые данные к асинхронной операции, по крайней мере ASIO это как-то делает, в этом случае необходимость в поиске по индексу вообще отпадает
# существуют хэш таблицы
# существуют бинарные деревья поиска

Да, да, да.
Повторюсь: это просто эксперимент/любопытство.


Цитата(MAKCim @  13.12.2009,  22:07 Найти цитируемый пост)
если ты используешь epoll, то epoll_event содежит поле data.ptr и с конкретным event'ом ты можешь связать объект, который будет хранить дескриптор

Знаю. Так я и сделал. Но хотелось понять.


Цитата(fry @  13.12.2009,  22:33 Найти цитируемый пост)
однако попытки запуска примера под виндой говорят о том, что описанный вариант является непереносимым по причине х.н знает какого алгоритма выделения значения дескриптора (ИМХО просто рандом полнейший). 

Естественно. Венда как-то по своему это реализует.
А к книге CD-ROM прилагается? Если да, выложи только этот код на какой-нить файлообменник. Спасибо.

Автор: andrew_121 13.12.2009, 23:02
Цитата(MAKCim @  13.12.2009,  22:07 Найти цитируемый пост)
ссылка 

Я так понимаю, это уже недры open() ?
Так вот, хотел начать читать от open() вглубь, так и не понял как тем сайтом пользоваться smile 

Автор: MAKCim 14.12.2009, 09:41
andrew_121, 
вот тебе open()
http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/fs/open.c#L1080 ;)

Цитата(andrew_121 @  13.12.2009,  23:02 Найти цитируемый пост)
так и не понял как тем сайтом пользоваться

да, описание системных вызовов достаточно трудно найти, т. к. поиск по sys_open, sys_creat и т. д. не работает из-за того, что для определения изпользуются макросы SYSCALL_DEFINEx

Автор: andrew_121 14.12.2009, 10:06
MAKCim, Спасибо. Ты случаем не в курсе, есть ли подобные сервисы еще?

Добавлено через 1 минуту и 25 секунд
наверное нет. иначе бы ты им и пользовался.

Добавлено через 12 минут и 49 секунд
Мдя...рано мне код ядра читать smile
Всем спасибо. Тема закрыта.

Автор: MAKCim 14.12.2009, 11:27
Цитата(andrew_121 @  14.12.2009,  10:06 Найти цитируемый пост)
наверное нет. иначе бы ты им и пользовался.

куча
искать по ключевым словам linux cross-reference
другое дело, что на этом сайте версии обновляются параллельно их выходу

Автор: andrew_121 14.12.2009, 12:36
MAKCim, Еще раз спасибо smile 

Автор: xvr 14.12.2009, 16:19
select (вместе с fd_set) используют файловый дескриптор именно как индекс. И если бы всех такое использование устраивало бы, то poll видимо не появился бы  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)