首先,让我道歉,因为我看到类似的问题在过去已经发布了很多次。但是,由于我对 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/