C函数作为线程调用-Linux用户区程序
我正在用C编写一个linux守护进程,它通过SPI接口(ioctl)从ADC获取值。SPI(spidev-userland)似乎有点不稳定,并且会在随机时间冻结守护进程 我需要更好地控制对获取值的函数的调用,我正在考虑将其作为一个线程,我可以等待它完成并获取返回值,如果它超时,则假设它冻结并杀死它,而这个新线程不会关闭守护进程本身。然后,我可以在重新启动之前应用诸如重置ADC之类的措施。这可能吗 我想要实现的伪示例: (函数获取int adc值(int adc通道,浮点*值))C函数作为线程调用-Linux用户区程序,c,linux,process,multithreading,daemon,C,Linux,Process,Multithreading,Daemon,我正在用C编写一个linux守护进程,它通过SPI接口(ioctl)从ADC获取值。SPI(spidev-userland)似乎有点不稳定,并且会在随机时间冻结守护进程 我需要更好地控制对获取值的函数的调用,我正在考虑将其作为一个线程,我可以等待它完成并获取返回值,如果它超时,则假设它冻结并杀死它,而这个新线程不会关闭守护进程本身。然后,我可以在重新启动之前应用诸如重置ADC之类的措施。这可能吗 我想要实现的伪示例: (函数获取int adc值(int adc通道,浮点*值)) pid=thre
非常感谢您对这个问题的任何意见,非常感谢您的示例!我会尝试使用这个库。我已经在我的一些c项目中使用过它,并取得了很好的成功,它可以让您很好地控制运行的内容和时间 在这里可以找到一个非常好的教程:
我建议采用另一种方法 编写一个采集样本并将其写入标准输出的程序。它只需在每次样本采集之前发出
警报(超时);
,如果挂起,程序将自动退出
编写另一个运行第一个程序的程序。如果它退出,它将再次运行。它的外观如下:
main(){for(;;){system("sampler");sleep(1);}}
(while true;do sampler;sleep 1; done)|program
然后在另一个程序中,使用FILE*fp=popen(“Supervision_sampler”,“r”);
读取fp
中的样本。更好的方法是:让程序简单地读取stdin中的样本,并坚持让用户这样启动您的程序:
main(){for(;;){system("sampler");sleep(1);}}
(while true;do sampler;sleep 1; done)|program
像这样拆分任务可以使开发和测试更容易,例如,您可以收集样本并将其保存到文件中,然后在该文件上运行程序:
sampler > data
program < data
采样器>数据
程序<数据
然后,当您对程序进行更改时,您可以简单地在相同的数据上反复运行它
启用数据记录也很简单——因此,如果发现严重问题,可以再次通过程序运行所有数据以查找错误。在glib中,有一种方法可以使用GCond检查线程(请在glib帮助中查找) 在resume中,您应该定期在子线程中设置GCond,并在主线程中使用g_cond_timed_wait检查它。glib或pthread也是如此 以下是pthread的一个示例:
线程在执行ioctl()时发生了一件非常有趣的事情,它进入了一种非常特殊的睡眠状态,称为磁盘睡眠,在调用返回之前它不能被中断或终止。这是经过设计的,可以防止内核从内到外腐烂 如果您的守护进程陷入
ioctl()
,可以想象它可能会永远保持这种状态(至少在重新设置ADC之前)
我建议删除一些东西,比如在已知错误接口上调用ioctl()
之前,先删除一个带有时间戳的文件。如果线程在xx秒内没有取消该文件的链接,则需要重新启动ADC
我也同意使用pthread,如果您需要示例代码,只需更新您的问题。谢谢您的快速回答。我认为pthread_cond_timedwait条件可能会起到作用-需要编写一些测试代码来看看它是如何工作的