Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли использовать дескриптор в качестве индекс, а? 
V
    Опции темы
andrew_121
Дата 13.12.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Привет.

Суть вопроса вот в чем: Мониторю события на дескрипторах при помощи 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 */
   }
}

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 13.12.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GwinnBleidd
Дата 13.12.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.5.2008
Где: Украина, Донецк

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) GwinnBleidd - 13.12.2009, 19:48
PM MAIL   Вверх
Lazin
Дата 13.12.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 1
Всего: 154



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

открой для себя хэш таблицы smile 
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 13.12.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



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:10


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 13.12.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



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

Это сообщение отредактировал(а) andrew_121 - 13.12.2009, 21:30


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 13.12.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 1
Всего: 154



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

PM MAIL Skype GTalk   Вверх
MAKCim
Дата 13.12.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

ссылка


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
fry
Дата 13.12.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



У Стивенса в "UNIX разработка сетевых приложений" дескрипторы используются в примере как индексы, однако попытки запуска примера под виндой говорят о том, что описанный вариант является непереносимым по причине х.н знает какого алгоритма выделения значения дескриптора (ИМХО просто рандом полнейший).
PM MAIL   Вверх
andrew_121
Дата 13.12.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Цитата(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 прилагается? Если да, выложи только этот код на какой-нить файлообменник. Спасибо.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 13.12.2009, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 14.12.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



andrew_121, 
вот тебе open()
open ;)

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 14.12.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



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

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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 14.12.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 14.12.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



MAKCim, Еще раз спасибо smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.