我的Windows机器上有一个可执行文件loop.exe
,它是使用MinGW&#39的gcc编译的。
loop.c
的代码在行为上类似于:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static int sigintReceived = 0;
void sigint_handler(int signum){
sigintReceived = 1;
}
int main(){
signal(SIGINT, sigint_handler);
while(1){
sleep(1);
if(sigintReceived){
printf("SIGINT received");
exit(0);
}
}
}
如果我使用Cygwin.bat
打开Cygwin终端并运行./loop.exe
然后按 Ctrl + C 我将看到输出:
SIGINT received
但是,如果我使用Cygwin.bat
打开 两个 终端并在另一个中运行./loop.exe
而在另一个中运行kill -2 <LOOP_EXE_PID>
,我会这样做根本看不到输出。
当我使用任何信号和处理程序运行kill -## <LOOP_EXE_PID>
时,代码就像没有信号处理程序一样(例如,如果我kill -10
我会得到一个Bus error
或者如果我kill -12
我将获得Bad system call
或者我kill -11
我将获得Segmentation fault
)
我环顾四周并遇到this answer我认为可能与我遇到的情况有关,但loop.exe
在每种情况下都会被终止。在这个答案中,Bogdan提到Windows可执行文件不是由Bash shell直接运行,而是通过中间Bash进程运行,当我运行./loop.exe
时,我可以在我的Windows任务管理器中看到此过程,但我看不到这个中间件来自Cygwin内部的Bash过程。
关于如何让kill -2 <LOOP_EXE_PID>
与 Ctrl + C 相同的任何想法?或者,我是如何从Cygwin内部看到这个中间Bash过程的想法?
注意:我使用C:\cygwin\Cygwin.bat
运行Cygwin;我不使用mintty。
答案 0 :(得分:2)
该程序是用MinGW编译的;因此,它不是Cygwin计划。
MinGW程序没有真正的POSIX信号处理;仅来自ISO C的最小信号API。
他们无法响应Cygwin环境中的外部信号。 Microsoft signal
中的MSVCRT.DLL
函数与Cygwin的信号处理之间没有任何关系。
从一个进程向另一个进程发送信号不是MS Windows中的概念。 Cygwin在自己的域中带来了这一点,就像它在控制台和其他任何东西上带来fork
和exec
,termios
之类的其他POSIX一样。
答案 1 :(得分:1)
MinGW中没有信号处理这样的东西。 Cygwin有自己的信号处理行为,无法从Cygwin外部处理。你最好的选择是与Cygwin的GCC一起编译或者看看微软signals。