代码之家  ›  专栏  ›  技术社区  ›  Jay

当从另一个线程关闭套接字时,阻塞recv不退出?

  •  2
  • Jay  · 技术社区  · 14 年前

    在Linux中,如果我们调用blocking recv 从一个线程关闭同一个套接字从另一个线程, 雷科 不会退出。

    为什么?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Matt Joiner    14 年前

    检查套接字的所有文件描述符是否已关闭。如果“远程端”(假设这是您试图关闭的一端),则 peer has not performed an orderly shutdown “。

    如果这仍然不起作用,请致电 shutdown(sock, SHUT_RDWR) 在远程端,这将关闭套接字,而不考虑引用计数。

        2
  •  11
  •   caf    14 年前

    “为什么”很简单,这就是它的工作原理,通过设计。

    在内核中, recv() 调用已调用 fget() struct file 与文件描述符相对应,这将阻止释放它,直到 fput() .

    你只需要改变你的设计(你的设计本身就很有活力——为了实现这一点,你必须没有锁保护用户空间中的文件描述符,这意味着 close() 可能只是发生了 之前 这个 记录() 调用-文件描述符甚至被重新用于其他用途)。


    如果您想唤醒另一个在文件描述符上阻塞的线程,应该让它阻塞 select() 相反,文件描述符集中包含一个管道,可以由主线程写入。