|
|
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
Есть небольшая консольная программка под линукс, которая считывает данные, приходящие к ней через сокет, изменяет их и перебрасывает дальше (на прокси). Работает в бесконечном цикле (фрагмент): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Как я понял по манам, это SIGTERM и делается это, например, так. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Однако, возникают 3 проблемы: 1) Судя по всему, sigHandler никогда не вызывается, и программа завершается сразу, молча, на предоставляя возможности культурно освободить используемыз сокет. 2) accept() будет ждать входящих соединений. Если их не будет, то программа повиснет (пока ей не придет SIGKILL). Как это исправить? Кинуть нолик на TCP порт самому себе? Или есть другие варианты? 3) есть используемые программой (и ей же созданные thread'ы). И там аналогичная ситуация - используются функции для сокетов, которые могут ожидать соединения. Как поступить? Плюнуть, в расчете что рано или поздно будет CONNECTION_TIMEOUT и thread завершится или можно как-то прервать ожидание входящих данных? Как лучше поступить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 17:03 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
Ожидать соединения можно путем прослушивания сокета на чтение селектом. Там можно выставить таймаут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 17:22 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
Может стоит попробовать перехватывать Код: plaintext 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 17:32 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
AkhОжидать соединения можно путем прослушивания сокета на чтение селектом. Там можно выставить таймаут. ето если сокет уже есть - после accept(). угу, ловить SIGINT надо, моно еще несколько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 19:27 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
Спасибо, буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 19:50 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
С SIGINT заработало, спасибо огромное. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 00:58 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
A. Fig Lee AkhОжидать соединения можно путем прослушивания сокета на чтение селектом. Там можно выставить таймаут. ето если сокет уже есть - после accept(). ... Открытый сокет прослушивается селектом на чтение, именно для чтения. :) Если сокет помечен листеном, то в данном случае селект на чтение, говорит о том, что можно делать ассепт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 09:40 |
|
||
|
Linux, accept(), SIGTERM и Ctrl+C
|
|||
|---|---|---|---|
|
#18+
man accept Для того, чтобы получать уведомления о входящих подключениях на сокете, вы можете использовать select(2) или poll(2). В этом случае, когда придет запрос на новое соединение, будет полученособытие "можно читать", и тогда вы можете вызват ь accept, чтобы получить сокет для этого соединения. В другом случае, вы можете заставить сокет передавать си г н а л SIGIO, когда он активируется; см. socket(7) для уточнения подробностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 09:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34359157&tid=2029359]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
284ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 593ms |

| 0 / 0 |
