V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
lestly
V2EX  ›  Linux

close 异常

  •  1
     
  •   lestly · 2022-11-08 11:22:33 +08:00 · 1536 次点击
    这是一个创建于 535 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    ho121
        1
    ho121  
       2022-11-08 12:00:19 +08:00
    leonshaw
        2
    leonshaw  
       2022-11-08 13:23:17 +08:00
    socket 怎么会变成 pipe ?程序又打开了什么东西?
    ihciah
        3
    ihciah  
       2022-11-08 13:59:38 +08:00 via iPhone
    fd 号会重用的,旧的 fd 关了再打开新的,可能是同一个 fd 号。
    lestly
        4
    lestly  
    OP
       2022-11-08 14:15:12 +08:00
    @ho121 netstat 检查了,不是 TIME_WAIT
    lestly
        5
    lestly  
    OP
       2022-11-08 14:16:57 +08:00
    @leonshaw 应该没有,程序只运行了很少模块。
    lestly
        6
    lestly  
    OP
       2022-11-08 14:18:12 +08:00
    @ihciah 句柄是同一个 iNode ,只不过 ls -l 后原本描述的 socket 变成 pipe ,并且程序再也无法使用这个句柄
    ihciah
        7
    ihciah  
       2022-11-08 14:41:20 +08:00
    @lestly 你的 socket 有遵循 RAII 吗?如果它 close 了那么就不应当有人继续持有它。handler 本质上就是存一个 fd 数字,如果 fd 关了但你还持有,那么要么是引用到了不存在的 fd ,要么是引用到了之后打开的 fd 。
    我猜一个 fix 是把你的 close 行为改成 shutdown writehalf ,这样 socket fd 仍旧是有效的;然后在 socket 对象析构时去做 fd close 。
    leonshaw
        8
    leonshaw  
       2022-11-08 14:47:51 +08:00
    @lestly strace 看看
    lestly
        9
    lestly  
    OP
       2022-11-08 15:00:25 +08:00
    @ihciah 多谢,我试试
    lestly
        10
    lestly  
    OP
       2022-11-08 15:00:45 +08:00
    lestly
        11
    lestly  
    OP
       2022-11-08 15:43:45 +08:00
    @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]'
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2612 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:51 · PVG 09:51 · LAX 18:51 · JFK 21:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.