Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C函数作为线程调用-Linux用户区程序_C_Linux_Process_Multithreading_Daemon - Fatal编程技术网

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

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编写一个linux守护进程,它通过SPI接口(ioctl)从ADC获取值。SPI(spidev-userland)似乎有点不稳定,并且会在随机时间冻结守护进程

我需要更好地控制对获取值的函数的调用,我正在考虑将其作为一个线程,我可以等待它完成并获取返回值,如果它超时,则假设它冻结并杀死它,而这个新线程不会关闭守护进程本身。然后,我可以在重新启动之前应用诸如重置ADC之类的措施。这可能吗

我想要实现的伪示例:

(函数获取int adc值(int adc通道,浮点*值)

  • pid=thread(get_adc_value(1,&value);//使线程调用函数
  • 等待直到完成(pid,超时);//等待直到函数完成/超时
  • 如果(超时)终止pid,重新开始//如果线程没有在给定时间内返回,终止它(它被冻结)
  • 否则,如果返回值正常,则继续//如果成功,则处理返回变量值并继续

  • 非常感谢您对这个问题的任何意见,非常感谢您的示例!

    我会尝试使用这个库。我已经在我的一些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条件可能会起到作用-需要编写一些测试代码来看看它是如何工作的