V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jicg
V2EX  ›  Go 编程语言

golang 没有办法监听到 程序退出事件啊(通过任务管理器,选择"结束任务",关闭)

  •  
  •   jicg · 2019-05-03 22:14:10 +08:00 · 5333 次点击
    这是一个创建于 2021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    windows 下 通过任务管理器,选择"结束任务",关闭程序。golang 有没有什么办法监听到关闭事件。os.Signal 对由任务管理器关闭无效。

    15 条回复    2019-05-05 00:46:24 +08:00
    chenset
        1
    chenset  
       2019-05-03 22:17:57 +08:00
    window 任务管理器这个以前查过, golang 层好像的确监听不到.
    chenset
        2
    chenset  
       2019-05-03 22:20:00 +08:00
    但是 windows 下的 IDE 的 run & stop 是支持的 os.Signal 的
    chenset
        3
    chenset  
       2019-05-03 22:21:34 +08:00
    所以要实现监听可以试试用命令行的 taskkill
    ysc3839
        4
    ysc3839  
       2019-05-03 22:39:49 +08:00 via Android
    Windows 没有 Unix 的 signal 机制,所以实现不了的。
    geelaw
        5
    geelaw  
       2019-05-03 23:16:44 +08:00 via iPhone
    CLI: 用 SetConsoleCtrlHandler 处理 CTRL_CLOSE_EVENT
    GUI: 在 WdProc 里处理 WM_CLOSE
    lusi1990
        6
    lusi1990  
       2019-05-03 23:56:51 +08:00 via Android
    go,not golang
    404neko
        7
    404neko  
       2019-05-04 00:36:37 +08:00
    .Net 可以用 WaitForExit 达到监听的目的 前提是进程是你的进程打开的
    KasuganoSoras
        8
    KasuganoSoras  
       2019-05-04 00:58:00 +08:00
    程序启动时顺带启动一个 cmd 脚本,脚本里面循环检测进程是否存在,如果不存在就执行 xxx
    DefoliationM
        9
    DefoliationM  
       2019-05-04 01:14:39 +08:00 via Android
    tasklist 抓一下
    zwh2698
        10
    zwh2698  
       2019-05-04 01:41:50 +08:00 via Android
    看了楼上回答的,没有一个满意的。监听进程如果你创建的,你可以 wait ,不是你创建的,你要打开进程句柄 wait, 是不是很烦。 所以进程管理的 queryprocessinfo 这个 API,你也可以用,这样就解决了。
    xuanbg
        11
    xuanbg  
       2019-05-04 08:24:31 +08:00
    任何程序都可以通过系统 API 监听进程运行状态,但都不能监听到自身的异常退出。因为在此之前,你就异常退出了呀。所以,自己另外起一个守护进程监听就好了嘛。
    Qzier
        12
    Qzier  
       2019-05-04 09:13:17 +08:00 via iPhone
    python 可以监听,go 不清楚。
    jicg
        13
    jicg  
    OP
       2019-05-04 10:19:38 +08:00
    主进程用 golang 写的。调用 winform 开发的 gui 程序。在任务管理器里面关闭 golang 程序的话,winform 程序还是在跑着。如果关闭 winform 程序,golang 能监听到,程序能正常退出
    kaneg
        14
    kaneg  
       2019-05-04 12:49:25 +08:00 via iPhone
    通过这种方式关闭进程和在 Linux 下用 kill -9 一样,根本不给进程任何机会就杀死了,所以不可能做出响应。
    usingnamespace
        15
    usingnamespace  
       2019-05-05 00:46:24 +08:00 via iPhone
    @kaneg 确实,kill 和 stop 无法捕捉。。内核源码改起来哈哈哈 重新编译内核 然后全盘崩掉(逃)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5722 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 109ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.