C函数调用为线程 – Linux用户程序

我正在写C语言的Linux守护进程,它通过SPI接口(ioctl)从ADC获取值。 SPI(spidev – userland)似乎有点不稳定,随机冻结守护进程

我需要对获取值的函数的调用有更好的控制,而且我正在考虑把它作为一个线程,我可以等待完成并获得返回值,如果超时,假设它冻结并且终止它没有这个新线程取下守护进程本身。 然后,我可以在重新启动之前应用重置ADC等措施。 这可能吗?

我想要实现的伪示例:

(函数int get_adc_value(int adc_channel,float * value)

  1. pid = thread(get_adc_value(1,&value); //使线程调用函数
  2. wait_until_finish(pid,timeout); //等待函数完成/超时
  3. 如果(超时)杀死PID,重新开始//如果线程在给定的时间没有返回,杀死它(它被冻结)
  4. 否则,如果返回值理智,继续//如果成功,处理返回variables值并继续

感谢您对此事的任何意见,例如高度赞赏!

我会尝试使用pthreads库。 我已经用它为我的一些C项目取得了很好的成功,它可以很好地控制什么在运行,什么时候运行。

一个很好的教程可以在这里找到: http : //www.yolinux.com/TUTORIAL/LinuxTutorialPosixThreads.html

在glib中,使用GCond来检查线程也是一种方法(在glib帮助中查找它)。

在简历中,你应该定期在子线程中设置一个GCond,并用g_cond_timed_wait在主线程中检查它。 这与glib或pthread是一样的。

下面是一个pthread的例子: http : //koders.com/c/fidA03D565734AE2AD9F5B42AFC740B9C17D75A33E3.aspx? s=% 22pthread_cond_timedwait%22#L46

我会推荐一个不同的方法。

编写一个程序,将采样写入标准输出。 它只需要有alarm(TIMEOUT); 在每次采样之前,如果挂起程序会自动退出。

写另一个运行第一个程序的程序。 如果退出,它会再次运行。 它看起来像这样:

 main(){for(;;){system("sampler");sleep(1);}} 

然后在你的其他程序中,使用FILE*fp=popen("supervise_sampler","r"); 并从fp读取样本。 更好的是:让程序简单地从标准输入读取样本,并坚持用户启动你的程序是这样的:

 (while true;do sampler;sleep 1; done)|program 

像这样拆分任务使开发更容易,更容易测试,例如,您可以收集示例并将其保存到文件中,然后在该文件上运行程序:

 sampler > data program < data 

然后,当您对程序进行更改时,您可以简单地重复运行同一个数据。

启用数据记录也是微不足道的 – 所以如果你发现一个严重的问题,你可以通过你的程序再次运行你的所有数据来查找错误。

当一个线程执行一个ioctl()时,会发生一些非常有趣的事情,它会进入一种非常特殊的睡眠模式,称为磁盘睡眠模式 ,直到调用返回时才会被打断或中止。 这是通过设计来防止内核从内而外腐烂。

如果你的守护进程卡 ioctl() ,可以想象它可能永远保持这种状态(至少在ADC被重新设置之前)。

我建议调用已知的越野界面上的ioctl() 之前删除一些东西,比如带有时间戳的文件。 如果你的线程没有在xx秒的时间内断开这个文件的链接,那么其他的东西需要重新启动ADC。

我也同意使用pthreads,如果你需要示例代码,只需更新你的问题。