«почему» просто так устроено.
В ядре вызов recv()
вызвал fget()
в struct file
, соответствующем дескриптору файла, иэто предотвратит его освобождение до тех пор, пока соответствующий fput()
.
Вам просто придется изменить свой дизайн (в любом случае, ваш дизайн по своей природе является очень быстрым - для этого вам не нужно блокировать защиту дескриптора файла).в пользовательском пространстве, что означает, что close()
мог произойти просто за до вызова recv()
- и дескриптор файла даже был повторно использован для чего-то другого).
Если выесли вы хотите разбудить другой поток, блокирующий дескриптор файла, вы должны вместо этого заблокировать его на select()
, с включенным в набор дескрипторов файла каналом, в который может записывать основной поток.