C程序终止时执行system命令切换音频通道及GPIO状态问题求助
解决程序终止时自动切换音频输入的问题
看起来你是想让程序退出时自动把音频切回主输入对吧?我之前做类似硬件控制程序时也遇到过这个需求,用C标准库的atexit()函数就能搞定,不过得注意它的适用场景,还有异常退出的情况。
首先,核心思路是:注册一个清理函数,让程序在正常终止时自动执行它;另外,为了处理像Ctrl+C这种信号导致的异常退出,还要加上信号处理逻辑,确保不管怎么退出,切换命令都能执行。
完整代码示例
#include <stdlib.h> // 必须包含,atexit、exit都在这里声明 #include <stdio.h> #include <signal.h> // 处理终止信号用 #include <unistd.h> // sleep函数依赖这个头文件 // 清理函数:程序退出时执行切回主输入的命令 void cleanup_audio() { int exec_result = system("irsend SEND_ONCE newremote KEY_1 && gpio mode 6 output && gpio write 6 0"); if (exec_result == -1) { fprintf(stderr, "Error: Failed to run cleanup command\n"); } } // 信号处理函数:处理Ctrl+C(SIGINT)、kill命令(SIGTERM)这类终止信号 void handle_termination_signal(int sig) { cleanup_audio(); exit(sig); // 按照信号的默认行为退出程序 } int main() { // 注册正常退出时的清理函数 if (atexit(cleanup_audio) != 0) { fprintf(stderr, "Error: Could not register cleanup function\n"); return 1; } // 注册信号处理,覆盖常见的终止信号 signal(SIGINT, handle_termination_signal); signal(SIGTERM, handle_termination_signal); // 程序启动时执行切换到通道2的命令 int start_result = system("irsend SEND_ONCE newremote KEY_2 && gpio mode 6 output && gpio write 6 1"); if (start_result == -1) { fprintf(stderr, "Error: Failed to run startup command\n"); return 1; } // 这里放你的主程序逻辑,示例用死循环让程序保持运行 printf("Program running... Press Ctrl+C to exit\n"); while (1) { sleep(1); } return 0; }
编译时的注意事项
如果之前编译报错,大概率是因为没包含必要的头文件:
- 比如没加
#include <stdlib.h>,编译器会报implicit declaration of function 'atexit',加上这个头文件就能解决; - 如果用了
sleep函数,记得加#include <unistd.h>,否则也会出现函数未声明的错误。
编译用常规的GCC命令即可:
gcc your_program.c -o your_program
额外说明
atexit()只会在程序正常终止时触发:比如调用exit()、main函数自然返回;- 对于信号导致的异常终止(比如Ctrl+C、kill命令),需要用
signal()注册处理函数,才能确保清理命令被执行; - 如果你还有其他需要处理的终止信号(比如SIGQUIT),可以继续用
signal()添加对应的处理逻辑。
内容的提问来源于stack exchange,提问作者user2559392
相关产品推荐
相关产品推荐

