You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:23:08