Raspberry Pi在CTRL+上清洁退出;C中的C

Raspberry Pi在CTRL+上清洁退出;C中的C,c,raspberry-pi3,gpio,C,Raspberry Pi3,Gpio,首先,让我道歉,因为我可以看到类似的问题在过去已经被张贴了好几次。然而,由于我对C非常不熟悉,我需要帮助确认这一点 我试图确保如果我用CTRL+C中断我的程序,它会留下一个干净的gpio。用python或java很容易做到,但C对我来说是一个更难破解的难题,因为我相信C中最终不存在try-catch。通过谷歌搜索,我找到了我认为可能是解决方案的东西,但我没有经验,我不确定它是否做得好。这是我的密码: #include <stdio.h> #include <wiringPi.h

首先,让我道歉,因为我可以看到类似的问题在过去已经被张贴了好几次。然而,由于我对C非常不熟悉,我需要帮助确认这一点

我试图确保如果我用CTRL+C中断我的程序,它会留下一个干净的gpio。用python或java很容易做到,但C对我来说是一个更难破解的难题,因为我相信C中最终不存在try-catch。通过谷歌搜索,我找到了我认为可能是解决方案的东西,但我没有经验,我不确定它是否做得好。这是我的密码:

#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;
}
#包括
#包括
#包括
void CleanGPIO(){
pinMode(1,输入);
}
int main()
{
wiringPiSetup();
信号(SIGINT、CleanGPIO);
引脚模式(1,PWM_输出);
对于(int i=0;i<1024;++i){
pwmWrite(1,i);
延迟(1);
}
对于(int i=1023;i>=0;--i){
pwmWrite(1,i);
延迟(1);
}
pinMode(1,输入);
返回0;
}

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

您的解决方案几乎是正确的。您还应该调用
exit
,以强制程序终止(假设您想立即终止)。
exit
调用获取一个参数,该参数是要返回给调用方的退出状态(例如shell)。对于异常终止,该值应为非零

因此,它应该是:

void CleanGPIO() {
    pinMode(1,INPUT);
    exit(1);
}

如果您不想退出处理程序,而是想以更可控的方式从
main
退出,您可以设置一个标志,并检查循环内的标志值。

从信号处理程序调用任何未指定为信号安全的函数是未定义的行为。我想对于
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
是为了在正确的clenup花费太长时间或由于任何原因被卡住的情况下,允许使用第二个ctrl+c强制终止程序。

这是处理信号的正确方法。不过,您可能需要为类似的信号添加挂钩。非常感谢Rick,我将按照预期进行研究。。。有更好的解决办法吗?这不是一个C问题,而是一个。很抱歉,我不知道CodeReview部分。感谢您指出,还有atexit Thx,在ctrl+c和实际终止之间有一个轻微的延迟,现在随着您的建议的实施,它已经消失了谢谢您,这看起来像是我正在寻找的安全解决方案(如果我没有弄错的话,rghome也建议使用alt方法)