Перед голосованием, чтобы закрыть, пожалуйста, прочитайте, я знаю, что есть похожие вопросы (:
Вот моя ситуация - у меня есть приложение, которое является многопоточным. Итак, допустим, у меня есть 10 потоков. Все они читаются из одного файлового дескриптора (на самом деле это сокет). И в очень редкой ситуации, когда возникает критическая ошибка, сокет должен быть shutdown
одним из потоков. Дело в том, что любой из этих потоков может это сделать. Если закрытие сокета завершилось неудачно, _Exit( FAILURE )
выполняется (я знаю, что это звучит как ужасный дизайн или проблема в коде, но на самом деле это не так, так как это вызвано сторонним lib. , что есть ошибка).
А вот проблемная ситуация - все они могут попробовать shutdown
сокет одновременно. И один закрывает его, но другие не могут его закрыть (shutdown
возвращает -1, так как сокет уже закрыт), а плохой _Exit( FAILURE )
выполняется, и это все разрушает.
Очевидно, мне нужна дополнительная проверка - если сокет уже закрыт (возможно, все потоки не смогли закрыть сокет по какой-то причине, и тогда хотя бы один из них должен выполнить _Exit
, поэтому проверяет код возврата shutdown
недостаточно).
Ну, я нашел этот вопрос, и похоже, что это именно то, что я пытаюсь сделать.
Но я знаю, что любой вид системных вызовов требует времени (конечно), и это зависит от ОС, когда именно сокет будет закрыт.
И вот вопрос - как я могу изменить ситуацию, если сокет уже закрыт или по какой-то причине не может быть закрыт? Будет ли fcntl
убедить меня, что если один поток закрыл сокет и в то же время, если другой поток попытается shutdown
сокет, произойдет сбой, и затем, если я выполню эту проверку (с fcntl
), это будет работать для меня?
Я также видел другие ответы, такие как: «вы можете использовать select
или poll
», но они все еще являются системными вызовами, и я не знаю, будут ли они лучшим выбором. Я также не знаю, как именно их использовать, но это не имеет большого значения, я думаю.
Спасибо!
Я также могу проверить errno
, установленный shutdown
, но что значит «подключен»? И в чем разница между «подключен» и «не допустимый дескриптор»
ENOTCONN
The specified socket is not connected.
Кроме того, меня беспокоит то, что FD, который я пытаюсь закрыть, может быть недействительным, поскольку я беру его из /proc/net/tcp
, сопоставленного с proc/PID/fd
, и я не знаю, будут ли все файлы выглядеть кстати, они выглядят на моей ОС (ОС будет наверняка RHEL4 или RHEL5, если это имеет значение)
Doh! Это чертовски долго, но я не могу объяснить это короче.