Cygwin中的信号处理行为

时间:2017-07-20 17:24:10

标签: c windows cygwin mingw signal-handling

我的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。

2 个答案:

答案 0 :(得分:2)

该程序是用MinGW编译的;因此,它不是Cygwin计划。

MinGW程序没有真正的POSIX信号处理;仅来自ISO C的最小信号API。

他们无法响应Cygwin环境中的外部信号。 Microsoft signal中的MSVCRT.DLL函数与Cygwin的信号处理之间没有任何关系。

从一个进程向另一个进程发送信号不是MS Windows中的概念。 Cygwin在自己的域中带来了这一点,就像它在控制台和其他任何东西上带来forkexectermios之类的其他POSIX一样。

答案 1 :(得分:1)

MinGW中没有信号处理这样的东西。 Cygwin有自己的信号处理行为,无法从Cygwin外部处理。你最好的选择是与Cygwin的GCC一起编译或者看看微软signals