我有一个可执行文件loop.exe
在我的 Windows 机器上,它是使用 MinGW 的 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。
最佳答案
程序使用MinGW编译;因此它不是 Cygwin 程序。
MinGW 程序没有真正的 POSIX 信号处理;只有 ISO C 的最小信号 API。
它们无法响应 Cygwin 环境中的外部信号。 Microsoft MSVCRT.DLL
中的signal
函数与 Cygwin 的信号处理之间没有任何关系。
从一个进程向另一个进程发送信号在 MS Windows 中不是一个概念。 Cygwin 在自己的领域中实现了这一点,就像它通过控制台实现其他 POSIX 事物一样,例如 fork
和 exec
、termios
等否则。
关于c - Cygwin 中的信号处理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221363/