【问题标题】:Handle signal from 'kill -3' or taskkill in Win32Console application在 Win32Console 应用程序中处理来自“kill -3”或 taskkill 的信号
【发布时间】:2013-11-18 03:43:49
【问题描述】:

我有一个 Win32 控制台应用程序(从 Visual Studio 构建为 Win32 控制台项目),它执行一些日志文件 (.txt) 处理。我有一个单独的 perl 程序(遗留程序),它现在需要启动这个 Win32 控制台应用程序,然后在完成后停止。

Perl 程序使用 Win32::Process API 启动 Win32 控制台应用程序的实例。当通过“kill -x pid”或 Win32:Process:Kill 完成时,它可以终止控制台应用程序。问题是控制台应用程序需要知道它是否被杀死/终止,以便它可以刷新日志处理。控制台应用程序已经通过 SetConsoleCtrlHandler API 注册了一个处理程序,但是当被 perl 程序通过 kill -2/3 pid 杀死时不会被调用。

  • 我应该在 perl 程序或 Win32 控制台应用程序中进行哪些更改,以便它知道何时终止?

谢谢!

【问题讨论】:

    标签: perl console-application


    【解决方案1】:

    如果您习惯于 Unix,Windows 中的信号处理会有点奇怪。我对此进行了大量调查,并写下了我的发现here(从第 261 行开始)。

    简答:Windows 进程可以设置$SIG{INT}$SIG{QUIT}$SIG{BREAK}。所有其他信号处理程序都被忽略。使用内置 kill 向您单独的应用发出信号:

    kill 'INT', $the_win32_logger_pid;
    kill 'QUIT', $the_win32_logger_pid;
    kill 'BREAK', $the_win32_logger_pid;
    

    【讨论】:

    • 谢谢暴民。我需要在 Win32 控制台应用程序中做些什么才能接收到这个信号?还是只是 SetConsoleCtrlHandler 中的一个处理程序集就足够了?我只是杀死'QUIT' pid并没有取得多大成功?控制台应用似乎没有收到信号:(
    • 我的印象是控制台应用程序是一个 Perl 程序;然后您可以在控制台应用程序中设置$SIG{QUIT} 并优雅地退出。但也许我错了?
    • Perl 程序是一个遗留软件,它反过来启动和停止 win32 控制台应用程序。控制台应用程序(与日志混淆的应用程序)是一个 Visual Studio 构建的项目,称为“Win32 控制台应用程序”。
    • 抱歉,那我的深度不够了。我的回答适用于 Windows 上的一个 Perl 程序,它向 Windows 上的另一个 Perl 程序发出信号。
    • 好的,感谢您的尝试。我已经在上面澄清了我的问题,表明控制台应用程序是 Visual Studio 构建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多