c - Cygwin 中的信号处理行为

标签 c windows cygwin mingw signal-handling

我有一个可执行文件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 事物一样,例如 forkexectermios 等否则。

关于c - Cygwin 中的信号处理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221363/

相关文章:

SSE中的比较操作

c - 如何在c中处理输入缓冲区

c - 如何正确识别C中的不同行尾?

C++ 入口点 -> main()

windows - 如何在批处理脚本中删除变量中的引号

c++ - 加载c++ dll文件时如何修复EXCEPTION_ACCESS_VIOLATION?

linux - Windows 和 Linux 之间的文件层次结构差异

c - C rand() 的问题

windows - 如何使用批处理脚本对目录中的每个文件执行某些操作

emacs - Emacs 中的 cygwin shell - 输出搞砸了?