powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка select'ом на запись.
14 сообщений из 14, страница 1 из 1
Проверка select'ом на запись.
    #34038718
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-то юзал такое?
Пишу сразу по 2 раза в pipe. Сначала проверяю селектом, а потом пробую записать. Так вот, на 2-м разе, мне селект возвращает 0, и можно ждать соколько угодно долго, а если им не проверять, то все записыватеся великолепно. В чем может быть дело?
Файловые дескрипторы правельные, параметры тоже.

ОС linux
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34039354
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно сам селект поглядеть?
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34040793
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, да:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
fd_set fs;
struct timeval tv

FD_ZERO(&fs);
FD_SET(pp[nPipe][ 1 ]);
tv.tv_sec= 0 ;
tv.tv_usec= 10 ;//Сюда, хоть час пихай, не аукнется

select(pp[nPipe][ 1 ]+ 1 , NULL, &fs, NULL, &tv);
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34040835
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, можно ли как-нибудь pipe сдалать не блокирующим?
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34040972
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложилось впечатление, что селект на реад, возвращает 1, если труба пустая или последняя операция была на считывание. Блокировка же на запись происходит, когда в требе 512 записей или 2К данных (что-то из этого). В документации написано, что трубы являются блокирующими. Значит, наверное, с этим ничего поделать нельзя. Тогда может можно как-нибудь узнать на сколько заполнилась труба?
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34041001
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhДа, кстати, можно ли как-нибудь pipe сдалать не блокирующим?


Код: plaintext
1.
int result=fcntl(fd,F_SETFL, O_NONBLOCK);
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34041065
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhСложилось впечатление, что селект на реад, возвращает 1, если труба пустая или последняя операция была на считывание. Блокировка же на запись происходит, когда в требе 512 записей или 2К данных (что-то из этого). В документации написано, что трубы являются блокирующими. Значит, наверное, с этим ничего поделать нельзя. Тогда может можно как-нибудь узнать на сколько заполнилась труба?


Так:
Код: plaintext
1.
2.
int s_rsz;
int result=ioctl(fds, FIONREAD , &s_rsz);
для сокетов работает, думаю должно работать и для пайпа.


И в качестве идеи(Сам еще не пробовал)
Можно попробовать открыть перехват SIGIO.
А по приходу сигнала читать.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34041085
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пасибо, буду эксперементировать.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34041283
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhПасибо, буду эксперементировать.

Я понял почему второй селект не возвращает управление.
Он ловит SIGIO и сбрасывает флаг сигнала.
Пока в пайпе не появятся новые данные( придет новый SIGIO)
select управления не вернет, не смотря на то
что в буфере еще остались данные от предидущего чтения.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34041368
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- AkhПасибо, буду эксперементировать.

Я понял почему второй селект не возвращает управление.
Он ловит SIGIO и сбрасывает флаг сигнала.
Пока в пайпе не появятся новые данные( придет новый SIGIO)
select управления не вернет, не смотря на то
что в буфере еще остались данные от предидущего чтения.

Как-то это криво, через сброс флага, получается, что двойной чеккинг не возможен? Все сходится, но тогда работа селекта кажется корявой.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34042395
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh onstat- AkhПасибо, буду эксперементировать.

Я понял почему второй селект не возвращает управление.
Он ловит SIGIO и сбрасывает флаг сигнала.
Пока в пайпе не появятся новые данные( придет новый SIGIO)
select управления не вернет, не смотря на то
что в буфере еще остались данные от предидущего чтения.

Как-то это криво, через сброс флага, получается, что двойной чеккинг не возможен? Все сходится, но тогда работа селекта кажется корявой.

Если программа зделала чтение
то сама может получить состояние дескриптора(синхронный режим).
по завершению операции.
И приять решение осталось ли что то еще в буфере, или нет.
Ей же вернули готовый дескриптор, а сколько нужно читать
и сколько будет прочитано это уже не дело select.

Операция чтения тоже работает с этими флагами,
и часть ответственности за то, что повторый select ничего
не возвращает лежит на ней.

Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет.
Вполне может быть, что и read.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34042497
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Если программа зделала чтение
то сама может получить состояние дескриптора(синхронный режим).
по завершению операции.
И приять решение осталось ли что то еще в буфере, или нет.
Ей же вернули готовый дескриптор, а сколько нужно читать
и сколько будет прочитано это уже не дело select.

Операция чтения тоже работает с этими флагами,
и часть ответственности за то, что повторый select ничего
не возвращает лежит на ней.

Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет.
Вполне может быть, что и read.

Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется.

Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34042687
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh onstat-Если программа зделала чтение
то сама может получить состояние дескриптора(синхронный режим).
по завершению операции.
И приять решение осталось ли что то еще в буфере, или нет.
Ей же вернули готовый дескриптор, а сколько нужно читать
и сколько будет прочитано это уже не дело select.

Операция чтения тоже работает с этими флагами,
и часть ответственности за то, что повторый select ничего
не возвращает лежит на ней.

Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет.
Вполне может быть, что и read.

Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется.

Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write.

1. По идее если установлен режим O_NONBLOCK, write должен вернуть ошибку
(не проверял).
2. Нужно разрешать и ловить SIGIO.
3. Заказывать SIGALARM, если дескриптор заблокируется,
сигнал разбудит процесс.
...
Рейтинг: 0 / 0
Проверка select'ом на запись.
    #34043316
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется.

Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write.

1. По идее если установлен режим O_NONBLOCK, write должен вернуть ошибку
(не проверял).
2. Нужно разрешать и ловить SIGIO.
3. Заказывать SIGALARM, если дескриптор заблокируется,
сигнал разбудит процесс.[/quot]

Не уверен, что для пипей можно делать O_NONBLOCK (я так понимаю, через iocntl), т.к. в документации пишется, что они блокирующие.
На счет 2-го и 3-го пунктов, получается, что высокоуровневыми средаствами с пипями работать нельзя.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка select'ом на запись.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]