Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该使用什么信号来终止/终止Windows上的应用程序?_C++_Windows_Winapi_Signals_D - Fatal编程技术网

C++ 我应该使用什么信号来终止/终止Windows上的应用程序?

C++ 我应该使用什么信号来终止/终止Windows上的应用程序?,c++,windows,winapi,signals,d,C++,Windows,Winapi,Signals,D,对于POSIX环境,这很简单SIGTERM,SIGINT,SIGQUIT,SIGKILL,SIGHUP,等等 但我正在用D编写一个应用程序,它需要根据用户输入管理打开的应用程序,发送用户请求的信号。我需要知道这些Windows信号的等效值及其值。最重要的是什么?我找到了这方面的文档,但它没有POSIX文档那么全面 我将使用来自的std.process.kill(Pid-Pid,int-code或signal),但我不知道需要发送什么信号 谢谢 编辑:如评论中所讨论的,我已经标记了C++和D,因为

对于POSIX环境,这很简单
SIGTERM
SIGINT
SIGQUIT
SIGKILL
SIGHUP
,等等

但我正在用D编写一个应用程序,它需要根据用户输入管理打开的应用程序,发送用户请求的信号。我需要知道这些Windows信号的等效值及其值。最重要的是什么?我找到了这方面的文档,但它没有POSIX文档那么全面

我将使用来自的
std.process.kill(Pid-Pid,int-code或signal)
,但我不知道需要发送什么信号

谢谢


<>编辑:如评论中所讨论的,我已经标记了C++和D,因为这两种语言中的答案都是有用的。这两种语言是交叉兼容的,很容易相互移植。

Windows没有信号。 如果您确实想终止应用程序,请调用
TerminateProcess
。这可能导致它损坏正在写入的任何文件


如果造成损坏不是您的目标,那么您可以通过
GenerateConsoleCtrlEvent
关闭控制台应用程序,并通过发布窗口WM_关闭消息关闭GUI应用程序

一些应用程序通过显示提示用户保存文件的模式对话框来响应WM_CLOSE,因此您可能需要在进程句柄上有一个超时,如果需要的时间太长,只需调用TerminateProcess即可



如前所述,除非您的应用程序参与实际启动控制台应用程序,否则您实际上无法满足调用
generateConsoleControlevent
的要求,这是不幸的。即使连接到可以处理WM_CLOSE事件的控制台窗口,除非这是发送ctrl事件的秘密方式,否则控制台应用程序本身将无法响应WM_CLOSE消息以进行正确清理,因此您只需抱着最好的希望并使用
TerminateProcess

文件: , ,
Windows没有信号。 如果您确实想终止应用程序,请调用
TerminateProcess
。这可能导致它损坏正在写入的任何文件


如果造成损坏不是您的目标,那么您可以通过
GenerateConsoleCtrlEvent
关闭控制台应用程序,并通过发布窗口WM_关闭消息关闭GUI应用程序

一些应用程序通过显示提示用户保存文件的模式对话框来响应WM_CLOSE,因此您可能需要在进程句柄上有一个超时,如果需要的时间太长,只需调用TerminateProcess即可



如前所述,除非您的应用程序参与实际启动控制台应用程序,否则您实际上无法满足调用
generateConsoleControlevent
的要求,这是不幸的。即使连接到可以处理WM_CLOSE事件的控制台窗口,除非这是发送ctrl事件的秘密方式,否则控制台应用程序本身将无法响应WM_CLOSE消息以进行正确清理,因此您只需抱着最好的希望并使用
TerminateProcess

文件: , ,

在windows中根本不存在信号。对于控制台应用程序,您可以使用
GenerateConsoleCtrlEvent
。Windows POSIX兼容层不完整,因此我建议您找到其他方法终止进程。更多特定于Windows的方式。@RbMm不幸的是,仅适用于无法解决此问题的控制台应用程序。我需要能够终止或终止用户要求我终止的任何应用程序。对于Windows-“如果指定了codeOrSignal,则必须是一个非负数,将用作进程的退出代码。如果没有,进程将以代码1退出”-因此,如果您不想指定退出代码,请使用不提供
codeOrSignal
&的重载。可以在windows中使用
TerminateProcess
。对于控制台应用程序,您可以使用
GenerateConsoleCtrlEvent
。Windows POSIX兼容层不完整,因此我建议您找到其他方法终止进程。更多特定于Windows的方式。@RbMm不幸的是,仅适用于无法解决此问题的控制台应用程序。我需要能够终止或终止用户要求我终止的任何应用程序。对于Windows-“如果指定了codeOrSignal,则必须是一个非负数,将用作进程的退出代码。如果没有,进程将以代码1退出”-因此,如果不想指定退出代码,请使用不提供
codeOrSignal
&的重载。可以使用
TerminateProcess
generateConsoleControlevent
相当于Unix
killpg
。它需要连接到同一控制台。在流程组长的PID上调用它(即通过
CREATE\u NEW\u process\u group
创建)会将事件发送到组中连接到控制台的所有流程。如果不是组ID,则该行为是未定义的。我观察到的是,控制台处理该行为的方式与组0类似,它将事件广播到所有连接的进程,包括调用进程。由于Windows进程组的文档记录很差,无法查询,我经常看到此函数被误用。我希望Windows能够添加一个
GenerateConsoleCtrlEventEx
函数,允许向单个进程和进程组发送控制事件(包括
CTRL\u CLOSE\u EVENT
)。然后我们可以使用
AttachConsole(processId)
GenerateConsolCtrlEventEx(CTRL\u CLOSE\u EVENT,processId,TARGET\u IS\u PROCESS\u ID)
。发送Ctrl+Close事件的行为与此相同,即在csrss.exe调用
TerminateProcess
之前,应用程序有5秒钟的时间退出,但只有一个进程/组被终止,而不是将
WM\u Close
发送到控制台窗口,控制台窗口终止所有连接的进程。
Gen