Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
lestly
V2EX  ›  Linux

close 异常

  •  1
     
  •   lestly · Nov 8, 2022 · 2992 views
    This topic created in 1464 days ago, the information mentioned may be changed or developed.

    非阻塞 socket ,执行请求超时后,就会被 close 掉。但是通过 ls -l /proc/pid/fd 看到,原本的 socket 变成了 pipe ,而且一直占用着这个句柄无法使用。另外写了检测程序,再次 close 才能把这个 pipe 删掉。这是为什么呢?

    ho121
    ho121
    Nov 8, 2022
    1
    leonshaw
    leonshaw
    Nov 8, 2022
    2
    socket 怎么会变成 pipe ?程序又打开了什么东西?
    ihciah
    ihciah
    Nov 8, 2022 via iPhone
    3
    fd 号会重用的,旧的 fd 关了再打开新的,可能是同一个 fd 号。
    lestly
    lestly
    OP
    Nov 8, 2022
    4
    @ho121 netstat 检查了,不是 TIME_WAIT
    lestly
    lestly
    OP
    Nov 8, 2022
    5
    @leonshaw 应该没有,程序只运行了很少模块。
    lestly
    lestly
    OP
    Nov 8, 2022
    6
    @ihciah 句柄是同一个 iNode ,只不过 ls -l 后原本描述的 socket 变成 pipe ,并且程序再也无法使用这个句柄
    ihciah
    ihciah
    Nov 8, 2022
    7
    @lestly 你的 socket 有遵循 RAII 吗?如果它 close 了那么就不应当有人继续持有它。handler 本质上就是存一个 fd 数字,如果 fd 关了但你还持有,那么要么是引用到了不存在的 fd ,要么是引用到了之后打开的 fd 。
    我猜一个 fix 是把你的 close 行为改成 shutdown writehalf ,这样 socket fd 仍旧是有效的;然后在 socket 对象析构时去做 fd close 。
    leonshaw
    leonshaw
    Nov 8, 2022
    8
    @lestly strace 看看
    lestly
    lestly
    OP
    Nov 8, 2022
    9
    @ihciah 多谢,我试试
    lestly
    lestly
    OP
    Nov 8, 2022
    10
    lestly
    lestly
    OP
    Nov 8, 2022
    11
    @ihciah 我的实现是这样的 A 线程创建 socket ,添加链表到 B 线程负责网络处理,我想这样应该不会引起多线程的占用 socket 的问题。我刚试了下,请求结束后,关闭连接时先 shutdown ,在 close ,还是会出现句柄释放不成功。
    这是我在 /proc/pid/fd ls -l 操作的结果
    lrwx------ 1 lestly lestly 64 11 月 8 15:25 10 -> 'socket:[208718]'
    close 后变成
    lr-x------ 1 lestly lestly 64 11 月 8 15:25 10 -> 'pipe:[208751]'
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1472 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:41 · PVG 00:41 · LAX 08:41 · JFK 11:41
    ♥ Do have faith in what you're doing.