LINUX.ORG.RU

Блокирующие функции сокетов.


0

0

Подскажите, pliz. Не могу понять, что блокируют блокирующие функции сокетов. Сам предполагаю несколько вариантов ответов:

1. Блокируются операции с конкретным сокетом для всех процессов. 2. Блокируются операции с конкретным сокетом для текущего процесса. 3. Блокируются операции с конкретным сокетом для текущего потока. 4. Блокируются операции со всеми сокетами для всех процессов.

(Под процессом понимаю главный поток и все дочерние)

Очень благодарен, если кому-то будет не лень указать правильный вариант или, если правильного нет, то добавить его.

anonymous

Ответ на: комментарий от grustnoe

Тут наверное несколько неправильно вопрос поставил. То, что блокируется поток это понятно. Меня интересует воздествие блокирующих функций друг на друга, к примеру, вызов send и recv одновременно из разных потоков для одного сокета. Кстати, уже после того, как задал вопрос, экспериментально выяснил, что это не приводит к ошибке. Но в этом случае неясен полный список причин возникновения ошибки типа, выполняется блокирующая функция?

anonymous
()
Ответ на: комментарий от anonymous

Дополнение. Смысл примерно таков, и send и recv блокирующие функции, и по идее при попытке выполнения send во время выполнения recv (в разных потоках для одного сокета), должна была бы генерироваться ошибка - выполняется блокирующая функция, но в данном случае этого не происходит. Как разобраться когда генерируется такая ошибка, а когда нет?

anonymous
()
Ответ на: комментарий от anonymous

С какой радости вообще должна возникнуть ошибка? На сколько я понимаю блокировка дает возможность точно знать чем кончился вызов функции без дополнительных затрат, что полезно. Если использовать ассинхронный (в данном случае неблокирующий) вызов, то программа просто может заняться чем-нибудь полезным во время IO. Ты уверен в том, что тебе есть чем заняться?

anonymous
()
Ответ на: комментарий от anonymous

Занимаюсь я вот чем - пытаюсь получить ответ на вопрос: в каких случаях возникает ошибка EINPROGRESS. В частности возникает ли эта ошибка при выполнении блокирующих функций в разных потоках, или она происходит только при выполнении того же только в одном потоке?

anonymous
()
Ответ на: комментарий от anonymous

EINPROGRESS возникает при неблокируемых операциях типа connect. Когда на неблокируемом сокете вызываешь connect он сразу возвращает управление, а в сеть отправляется SYN пакет. Если ты вызовешь функцию connect на том же сокете до того, как соединение будет завершено, то получишь эту ошибку, типа операция еще в процессе. Это один из сполсобов узнать завершилось ли уже подключение неблокируемого сокета.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.