![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Как реализуется ? Знаю что есть poll, который может проверить когда можно отправлять, знаю что send на "неблокируемый" сокет вернет сколько байт отправлено... Т.е. мне надо хранить кучу PTR'ов и организовывать логику отправки "по кусочкам"...... Вопрос - как это сделать по-людски ? Сделать в смысле следующее :
1. Есть дескриптор, в который отправляем файлО. (гигов эдак десять). 2. Есть второй дескриптор, который должен в интерактивном режиме реагировать на команды. Чего делать ? Доп. условия : Поток отправки не создавать. Ну не нужен мне лишний процесс ![]() Это сообщение отредактировал(а) GrayCardinal - 2.10.2006, 13:44 |
|||
|
||||
ZeusAtVingrad |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Может select'ом следить за обоими дескрипторами?
|
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
а чего так, вроде при COW создание процесса не так расточительно а вообще может так с select-ом
еще можно таймер поставить, чтобы одна операция другую по времени не вытеснила Это сообщение отредактировал(а) MAKCim - 2.10.2006, 15:40 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: нет Всего: 7 |
без лишнего процесса мона юзать sleep(MAX_DWORD) который совсем не жрет процессор. чем не нравится создать новый тред или вкинуть select в while(true)
-------------------- What DA F...??? |
|||
|
||||
dmiceman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
варианты:
1. select()/poll() (это одно и тоже) 2. спать по милисекундам 3. треды 4. ловить SIGIO выставив сокет в O_ASYNC (никогда таким извращением не занимался) 5. форкаться, делать в дите всю работу и умирать при всем богатстве выбора, альтернативы вариантам 1 и 3 нет. 5 -- по обстоятельствам. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
MAKCim,
Как определять размер "очередной порции", чтоб небыло блокировки ? Добавлено @ 08:55 dmiceman, Меня именно интересует вариант реализации при помощи select/poll. Если я после select что-то оправлю и канал окажется уже, прога у меня заблокируется до окончания передачи ![]() |
|||
|
||||
smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: нет Всего: 7 |
а если вынести отправку в отдельный тред, то все будет в порядке
-------------------- What DA F...??? |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
smalcom,
Предлагаешь создавать тред, который 99.99% своего времени будет простаивать (ожидая завершения отправки) ? ![]() |
|||
|
||||
smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: нет Всего: 7 |
пусть себе стоит он шо мешает. а во вторых почему стоит?
-------------------- What DA F...??? |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
smalcom,
Ну не лежит же ![]() |
|||
|
||||
smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: нет Всего: 7 |
как тока упадет бум его пороть
-------------------- What DA F...??? |
|||
|
||||
dmiceman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 9.9.2006 Репутация: нет Всего: нет |
ты не можешь определить размер рабочей порции. то есть тебе нужно иметь буфер отправки и буфер приема. писать и читать в дескрипторы следует в неблокирующем режиме (O_NONBLOCK). read() и write() для того и возвращают размер принятых/отправленных байт. и на оба дескриптора сажается select() в цикле. потом, если в командный дескриптор пришла полная команда -- обрабатывай. как ты будешь определять полная ли это команда сидит в буфере -- зависит от задачи. большинство демонов с текстовым интерфейсом (pop3, ftp, smtp) разделяют команды переводами строк. вот приблизительно так. просто -- не получится. как минимум пара сот строчек кода. |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Поставь O_NONBLOCK на сокет Насколько я знаю для каналов в этом случае возможна частичная запись если размер передаваемых данных больше текущей вместимости буфера. По идее с сокетами тоже должно работать, но не уверен Еще по-моему в настройках сокета с помощью setsockopt можно указать нижнию границу объема передаваемых данных, и если количество данных меньше чем это граничное значение, write на сокете не блокируется
Мне кажется все таки использование здесь потоков/процессов логичнее, имхо, конечно Это сообщение отредактировал(а) MAKCim - 3.10.2006, 17:40 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Угу. Всем спасибо... Остановился на варианте с вилкой. Написал Dtransmit которая файло перекидывает и забыл про траблу
![]() ![]() |
|||
|
||||
Нонейм |
|
|||
Unregistered |
Асинхронный ввод-вывод: aio_xxx
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |