簡體   English   中英

從另一個線程關閉套接字時,阻止recv不會退出?

[英]Blocking recv doesn't exit when closing socket from another thread?

在Linux中,如果我們從一個線程調用阻塞recv並從另一個線程關閉同一個套接字,則recv不會退出。

為什么?

“為什么”只是它的設計方式。

在內核中, recv()調用在與struct file對應的struct file上調用了fget() ,這將阻止它在相應的fput()之前被釋放。

你只需要改變你的設計(無論如何你的設計都是天生的 - 為了實現這一點,你必須沒有鎖定保護用戶空間中的文件描述符,這意味着close()可能發生 recv()調用之前 - 文件描述符甚至被重用於其他東西)。


如果你想喚醒另一個在文件描述符上阻塞的線程,你應該讓它在select()上阻塞,而是在主線程可以寫入的文件描述符集中包含一個管道。

檢查套接字的所有文件描述符是否已關閉。 如果在“遠程端”仍然打開(假設這是您嘗試關閉的那個),則“ 對等體未執行有序關閉 ”。

如果仍然無效,請在遠程端調用shutdown(sock, SHUT_RDWR) ,無論引用計數如何,都將關閉套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM