辣条侠 2021-10-22 12:35 采纳率: 0%
浏览 43

如何在程序里面判断程序进程被强制关闭了

.net写的控制台程序,如果是控制台正常关闭,可以用ProcessExit判定,可是如果程序本身是被强制退出的,比如有人在任务管理器上杀进程,这有办法能捕获到吗?
因为我需要在程序被退出时,做一些逻辑。。。

  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-10-22 13:36
    关注

    这个问题得分为两方面来讲。
    第一,被任务管理器的“进程”面板关闭的进程不可能进行任何清理工作,这是OS的设计。(不这样设计的话,假设你关机时有个进程一直卡死,你就永远没办法通过软件关机了。)
    第二,尽管如此,在多数异常退出情形下,你仍然可以让你的程序响应信号并进行清理工作。
    ====分割线====
    CS的话我不太懂,但C/C++的话,可以通过signal.h这个C库(是标准库的一部分)来处理多数异常退出情形。通过signal函数可以(暂时地)更换指定信号的回调函数。


    这两个链接中,第一个是POSIX(Unix标准)的,第二个是MSDN(Windows标准)的,Unix的信号比Windows的多,但也兼容。
    默认会终止进程的信号基本有以下几个:
    SIGKILL:Windows下没有,用于强制关闭进程,进程不会有任何进行清理工作的机会。在Windows任务管理器的进程面板结束进程的效果等同于Unix下发送SIGKILL。不能忽略,不能做任何其他处理。
    SIGTERM:要求关闭进程,但进程可以忽略该信号(但一般不建议忽略)。例如,用户尝试关机时,进程会收到这个信号。某些场景下,如果进程收到SIGTERM后一段时间内没有结束,就会被强制终止,因此收到信号后应当尽快执行最后的操作。
    SIGABRT:一般在调用abort函数后触发。似乎比较少见。
    SIGFPE:浮点运算错误,也可能不会触发程序终止。
    SIGILL:错误的二进制指令,很少见,除非程序损坏了,否则不会遇到。
    SIGINT:输入Ctrl+C组合键触发的用户中断,会终止进程,但是可以忽略,可以处理。
    SIGSEGV:由段错误触发,比较典型的情形是试图访问野指针指向的位置。除非决定通过setjmp处理,否则不要管它,这一般是软件代码bug导致的。
    ====分割线====
    如果你指的是要查看子进程的情况,那恐怕没有什么特别好的跨平台方法。
    如果是Unix下就好办了,直接查man手册的wait方法,它可以获取子进程的一切状态。
    Windows的话,根据MSDN的官方文档,应该没什么办法。通过CreateProcess系列函数启动进程后就只有通过GetExitCodeProcess来获得进程退出代码,而这个退出代码可能是main函数返回的值,可能是exit函数的值,可能是TerminateProcess或ExitProcess函数设定的值,还可能是异常和信号设置的异常值,而且没有区分方法,你只能试图避开这些Windows内部设置好的值,以免和正常的返回内容混淆。最好的做法就是:除非有必要,否则别在主函数里面返回任何除了0以外的东西,因为0一定表示正常退出。一定需要不同进程间交换信息的话,你可以在CreateProcess调用中重定向IO流,或者开个管道之类的,当然也可以用其他IPC手段。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月22日

悬赏问题

  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?