Visual Studio编译提示struct sigaction未定义如何解决
核心原因
struct sigaction和配套的sigaction()函数是POSIX体系的专属接口,仅在Linux、macOS、BSD这类原生兼容POSIX标准的系统上提供。你之前在Ubuntu下用gcc能正常编译,就是因为Ubuntu是符合POSIX标准的Linux发行版。
你现在编译失败本质是换了不兼容的运行环境:从代码里引入的<windows.h>、<conio.h>就能看出来你现在是在Windows环境下编译,Windows原生的系统头文件、C运行库根本没有实现POSIX信号相关的逻辑,你定义_POSIX_C_SOURCE宏完全没用——这个宏是给POSIX系统的头文件用的开关,Windows的头文件根本不识别这个宏定义,自然不会给你暴露struct sigaction的声明。
可行修复方案
根据你的需求二选一即可:
- 不需要强依赖
sigaction,只想在Windows下实现退出时清理资源的逻辑:直接换成跨平台的标准Csignal()接口,Windows和Linux下都能正常用,改造成本极低:- 首先把你注释掉的
<stdlib.h>头文件加回来,不然exit()函数没有合法声明 - 把原来基于
sigaction实现的catch_signal函数替换为标准C的signal实现即可,参考代码:
- 首先把你注释掉的
#include <windows.h> #include <stdio.h> #include <conio.h> #include <signal.h> #include <stdlib.h> HANDLE hCom; HANDLE hEvent; void diediedie(int sig) { puts("Bye, brutal world!"); if (hEvent) CloseHandle(hEvent); if (hCom) CloseHandle(hCom); exit(1); } int catch_signal(int sig, void (*handler)(int)) { return signal(sig, handler) == SIG_ERR ? -1 : 0; }
- 必须保留
sigaction相关代码不想改动:那就换支持POSIX兼容层的Windows编译/运行环境:- 最省心的方案是用WSL(Windows子系统Linux)安装gcc编译,和你之前的Ubuntu环境完全一致,代码不用改就能跑
- 也可以用Cygwin环境编译,它自带完整的POSIX接口兼容实现,头文件里包含
struct sigaction的定义
注意:哪怕你在Windows下用MinGW的gcc,默认链接的是微软原生C运行库,依旧没有sigaction实现,不要以为换了gcc编译器就能直接在Windows上用POSIX接口。
内容的提问来源于stack exchange,提问作者kancler
相关产品推荐
相关产品推荐

