上一篇
想象一下,你正在为智能手表开发嵌入式系统,某天测试时发现:当设备电量低于20%时,主进程无法及时通知后台服务关闭高功耗模块,这时,你需要一种轻量、即时、可靠的进程间通信机制——自定义信号正是为此而生!
在cLinux中,有三种信号注册方式,但嵌入式场景推荐优先使用sigaction
(更安全可控):
#include <signal.h> void handler(int sig) { printf("🚨 收到信号 %d\n", sig); } int main() { signal(SIGUSR1, handler); // 绑定SIGUSR1信号 while(1) pause(); // 等待信号 return 0; }
#include <signal.h> struct sigaction sa; void setup_handler() { sa.sa_handler = handler; sigemptyset(&sa.sa_mask); // 清空信号掩码 sa.sa_flags = SA_RESTART; // 自动重启系统调用 sigaction(SIGUSR1, &sa, NULL); }
#include <sys/signalfd.h> int sig_fd = signalfd(-1, &sig_set, 0); read(sig_fd, &buf, sizeof(buf)); // 同步读取信号
void custom_handler(int sig) { if (sig == SIGUSR1) { printf("🔋 低电量警报!剩余:20%%\n"); close_high_power_module(); // 自定义逻辑 } }
struct sigaction sa; sa.sa_handler = custom_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGUSR1, &sa, NULL) == -1) { perror("💥 信号注册失败"); exit(EXIT_FAILURE); }
// 进程A(发送方) #include <signal.h> kill(target_pid, SIGUSR1); // 向目标进程发送信号 // 或使用sigqueue携带数据 union sigval val; val.sival_int = 20; // 传递电量值 sigqueue(target_pid, SIGUSR1, val);
// 使用sa_sigaction获取附加数据 struct sigaction sa; sa.sa_sigaction = advanced_handler; sa.sa_flags = SA_SIGINFO; void advanced_handler(int sig, siginfo_t *info, void *context) { int battery = info->si_value.sival_int; printf("📊 收到电量数据:%d%%\n", battery); }
// 使用实时信号(如SIGRTMIN+1) sigaction(SIGRTMIN+1, &sa, NULL); kill(pid, SIGRTMIN+1);
void safe_handler(int sig) { static volatile sig_atomic_t flag = 0; if (!flag) { flag = 1; // 执行关键操作 flag = 0; } }
sigaction
后未遗漏错误处理// 接收端(低电量服务) #include <signal.h> #include <unistd.h> void battery_handler(int sig) { printf("🔋 执行省电操作...\n"); // 实际代码:关闭GPS、降低屏幕亮度等 } int main() { struct sigaction sa; sa.sa_handler = battery_handler; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); while(1) { sleep(1); // 保持进程运行 } return 0; } // 发送端(主进程) #include <stdlib.h> int main(int argc, char *argv[]) { int pid = atoi(argv[1]); kill(pid, SIGUSR1); return 0; }
通过本文,你已掌握在cLinux中实现自定义信号的完整流程,不妨在你的嵌入式项目中尝试用信号替代传统的轮询机制,感受异步通信的魅力吧!💡
本文由 业务大全 于2025-08-21发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/687632.html
发表评论