C 语言捕获 ctrl + c 按键信号方法

测试平台是 Windows 10,使用 MinGW GCC 编译器。

 

// 函数原型:void (*signal(int sig, void (*func)(int)))(int);
// 解释:
// signal 是一个函数
// signal 函数接受 2 个参数
// 第 1 个参数是 int 类型 sig
// 第 2 个参数是函数指针 func
// func 指针指向的函数接受一个 int 类型参数,无返回值
// signal 函数返回值是指针
// 这个指针是函数指针,指针指向的函数接受 1 个 int 类型参数,无返回值

#include <signal.h>
#include <stdio.h>
#include <windows.h>

void handler(int);

int main() {
    int count = 0;
    // signal 函数原型解释见上方注释
    // 注册 SIGINT 信号(按下 ctrl+c 触发)使用自定义的 handler 函数来处理
    // handler 也可以换成预定义的 SIG_ 开头的函数,比如 SIG_ACK 等
    signal(SIGINT, handler);
    while (1) {
        printf("循环第%d次\n", count++);
        Sleep(1000);
    }
    return 0;
}

void handler(int s) {
    printf("ctrl+c pressed!\n");
    printf("signal is: %d\n", s);
    printf("in handler sleep!\n");
    Sleep(5000);  // 按下 ctrl+c 后,此处 sleep 并不会阻塞程序运行
    printf("in handler awake!\n");
    exit(0);
}

  

posted @ 2022-05-13 16:10  hrpzcf  阅读(787)  评论(0)    收藏  举报