C 函数作为线程调用 - Linux 用户空间程序

3
我正在用C语言编写一个Linux守护进程,通过SPI接口(ioctl)从ADC获取值。SPI(spidev - userland)似乎不太稳定,并会在随机时间冻结守护进程。
我需要更好地控制获取值函数的调用,并考虑将其作为线程来实现,等待其完成并获得返回值。如果超时就假设它被冻结了并杀死它,而不影响守护进程本身。然后我可以采取措施,如重置ADC再重新启动。这样做是否可行?
下面是我想要实现的伪代码:
(function int get_adc_value(int adc_channel, float *value))
1. pid = thread(get_adc_value(1,&value)); //创建线程调用该函数 2. wait_until_finish(pid, timeout); //等待函数完成/超时 3. if(timeout) kill pid, start over //如果线程在给定时间内没有返回,则杀死它(它被冻结了) 4. else if return value sane, continue //如果成功,则处理返回变量值并继续
感谢您对此事的任何意见和建议,示例将不胜感激!
4个回答

2

谢谢您的快速回答。我认为pthread_cond_timedwait条件可能可以解决问题 - 需要编写一些测试代码来查看它的工作原理。 - Einar

1

0
我建议采用不同的方法。
编写一个程序,将样本写入标准输出。每次采集样本之前,它只需要有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

随着您对程序进行更改,您可以反复在相同的数据上运行它。

启用数据记录也非常简单-因此,如果您发现严重问题,可以再次运行所有数据以查找错误。


0

当一个线程执行ioctl()时,它会进入一种非常特殊的睡眠状态,称为磁盘睡眠,在此期间它不能被中断或杀死,直到调用返回。这是有意设计的,可以防止内核从内部腐烂。

如果您的守护程序在ioctl()中卡住了,那么它可能会永远卡住(至少要重置ADC才能解决)。

我建议在调用已知有问题的接口之前,放置一个带有时间戳的文件。如果您的线程在xx秒内没有删除该文件,则需要其他东西重新启动ADC。

我也同意使用pthread,如果您需要示例代码,请更新您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接