c - C 中的 CTRL+C 上的 Raspberry Pi 干净退出

标签 c raspberry-pi3 gpio

首先,让我道歉,因为我看到类似的问题在过去已经发布了很多次。但是,由于我对 C 非常陌生,我需要帮助确认这一点。

如果我用 CTRL+C 中断我的程序,我试图确保我的程序留下一个干净的 gpio。在 python 或 java 中很容易完成,但 C 被证明对我来说更难破解,因为我被引导相信 C 中不存在 try-catch-finally 。谷歌搜索,我发现我认为可能是解决方案,但像我这样没有经验,我不确定它是否正确完成。这是我的代码:

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

void CleanGPIO() {
    pinMode(1,INPUT);
}
int main()
{

    wiringPiSetup();

    signal(SIGINT, CleanGPIO);
    pinMode(1, PWM_OUTPUT);

    for (int i = 0; i < 1024; ++i) {
        pwmWrite(1, i);
        delay(1);
    }
    for (int i = 1023; i >= 0; --i) {
        pwmWrite(1, i);
        delay(1);
    }
    pinMode(1,INPUT);
    return 0;
}

我已经对其进行了测试并且它按预期工作(在我用 CTRL+C 中断它之后,引脚 1 被设置为 IN),但我担心这是否是安全的方法,以及是否有更好的方法可用的解决方案。

最佳答案

从信号处理程序调用任何未指定为信号安全的函数是未定义的行为。我想关于 pinMode 没有这样的保证。

正确的方法是设置一个 volatile int 标志,您可以在主循环中定期检查该标志。

volatile int terminating = 0;

void terminate(int sign) {
  signal(SIGINT, SIG_DFL);
  terminating = 1;
}


int main() {

  for (...) {
    if (terminating) {
       // cleanup
       exit(1);
    }

  }

}

在处理程序中调用 signal 是为了允许使用第二个 ctrl+c 强制终止程序,以防适当的清理花费太长时间或由于任何原因被卡住。

关于c - C 中的 CTRL+C 上的 Raspberry Pi 干净退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509755/

相关文章:

c - Linux 本地通信套接字 : Why is bind() not failing as expected?

Android Things with Raspberry Pi for Bmx280SensorDriver Example 不工作

python - cv2.错误 : (-215) s >= 0 in function setSize

3g - 将 Raspberry Pi 3 连接到 3G 适配器(高通调制解调器)

linux - 访问 GPIO 时出现段错误

c++ - 如何使用寄存器和偏移地址?

c - realloc 的使用是否正确?

c - C 中的 scanf string 和 printf 不能按预期工作

c - 在 **my_vector 和 ***my_vector 上应用 free() 的区别

javascript - 树莓派 PHP GPIO 读取