|
|
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Кто-то юзал такое? Пишу сразу по 2 раза в pipe. Сначала проверяю селектом, а потом пробую записать. Так вот, на 2-м разе, мне селект возвращает 0, и можно ждать соколько угодно долго, а если им не проверять, то все записыватеся великолепно. В чем может быть дело? Файловые дескрипторы правельные, параметры тоже. ОС linux ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 18:02 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
а можно сам селект поглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2006, 12:52 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Ну, да: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 10:29 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Да, кстати, можно ли как-нибудь pipe сдалать не блокирующим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 10:40 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Сложилось впечатление, что селект на реад, возвращает 1, если труба пустая или последняя операция была на считывание. Блокировка же на запись происходит, когда в требе 512 записей или 2К данных (что-то из этого). В документации написано, что трубы являются блокирующими. Значит, наверное, с этим ничего поделать нельзя. Тогда может можно как-нибудь узнать на сколько заполнилась труба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:16 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
AkhДа, кстати, можно ли как-нибудь pipe сдалать не блокирующим? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:26 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
AkhСложилось впечатление, что селект на реад, возвращает 1, если труба пустая или последняя операция была на считывание. Блокировка же на запись происходит, когда в требе 512 записей или 2К данных (что-то из этого). В документации написано, что трубы являются блокирующими. Значит, наверное, с этим ничего поделать нельзя. Тогда может можно как-нибудь узнать на сколько заполнилась труба? Так: Код: plaintext 1. 2. И в качестве идеи(Сам еще не пробовал) Можно попробовать открыть перехват SIGIO. А по приходу сигнала читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:40 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Пасибо, буду эксперементировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:45 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
AkhПасибо, буду эксперементировать. Я понял почему второй селект не возвращает управление. Он ловит SIGIO и сбрасывает флаг сигнала. Пока в пайпе не появятся новые данные( придет новый SIGIO) select управления не вернет, не смотря на то что в буфере еще остались данные от предидущего чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:34 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
onstat- AkhПасибо, буду эксперементировать. Я понял почему второй селект не возвращает управление. Он ловит SIGIO и сбрасывает флаг сигнала. Пока в пайпе не появятся новые данные( придет новый SIGIO) select управления не вернет, не смотря на то что в буфере еще остались данные от предидущего чтения. Как-то это криво, через сброс флага, получается, что двойной чеккинг не возможен? Все сходится, но тогда работа селекта кажется корявой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:56 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Akh onstat- AkhПасибо, буду эксперементировать. Я понял почему второй селект не возвращает управление. Он ловит SIGIO и сбрасывает флаг сигнала. Пока в пайпе не появятся новые данные( придет новый SIGIO) select управления не вернет, не смотря на то что в буфере еще остались данные от предидущего чтения. Как-то это криво, через сброс флага, получается, что двойной чеккинг не возможен? Все сходится, но тогда работа селекта кажется корявой. Если программа зделала чтение то сама может получить состояние дескриптора(синхронный режим). по завершению операции. И приять решение осталось ли что то еще в буфере, или нет. Ей же вернули готовый дескриптор, а сколько нужно читать и сколько будет прочитано это уже не дело select. Операция чтения тоже работает с этими флагами, и часть ответственности за то, что повторый select ничего не возвращает лежит на ней. Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет. Вполне может быть, что и read. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 17:10 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
onstat-Если программа зделала чтение то сама может получить состояние дескриптора(синхронный режим). по завершению операции. И приять решение осталось ли что то еще в буфере, или нет. Ей же вернули готовый дескриптор, а сколько нужно читать и сколько будет прочитано это уже не дело select. Операция чтения тоже работает с этими флагами, и часть ответственности за то, что повторый select ничего не возвращает лежит на ней. Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет. Вполне может быть, что и read. Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется. Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 17:37 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
Akh onstat-Если программа зделала чтение то сама может получить состояние дескриптора(синхронный режим). по завершению операции. И приять решение осталось ли что то еще в буфере, или нет. Ей же вернули готовый дескриптор, а сколько нужно читать и сколько будет прочитано это уже не дело select. Операция чтения тоже работает с этими флагами, и часть ответственности за то, что повторый select ничего не возвращает лежит на ней. Чесно говоря, кто сбрасывает флаг готовности я не знаю, нужно будет проверить, сейчас времени нет. Вполне может быть, что и read. Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется. Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write. 1. По идее если установлен режим O_NONBLOCK, write должен вернуть ошибку (не проверял). 2. Нужно разрешать и ловить SIGIO. 3. Заказывать SIGALARM, если дескриптор заблокируется, сигнал разбудит процесс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:35 |
|
||
|
Проверка select'ом на запись.
|
|||
|---|---|---|---|
|
#18+
onstat-Вообще, то я думал, что это ее дело. Я допустим узнаю, что можно прочитать блок и начну читать. Реад мне вернет сколько сможет, но не более, чем я запросил. А вот второй раз читать мне уже должно становиться страшно, а вдруг поток заблокируется. Но дело совсем не в чтении; с чтением, как раз все нормально и select по всей видимости хорошо с этим работает (все-таки, возвращает идентификатор трубы). Проблема, аналагичная рассуждаемой, возникла именно с write. 1. По идее если установлен режим O_NONBLOCK, write должен вернуть ошибку (не проверял). 2. Нужно разрешать и ловить SIGIO. 3. Заказывать SIGALARM, если дескриптор заблокируется, сигнал разбудит процесс.[/quot] Не уверен, что для пипей можно делать O_NONBLOCK (я так понимаю, через iocntl), т.к. в документации пишется, что они блокирующие. На счет 2-го и 3-го пунктов, получается, что высокоуровневыми средаствами с пипями работать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 09:56 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34040972&tid=2030327]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 540ms |

| 0 / 0 |
