我不确定如何在我正在编写的程序中处理异步任务,我希望更有经验的人至少能为我指明正确的方向。
我在嵌入式ARM处理器上运行Angstrom Linux。我的程序通过暴露的硬件PWM和PTP上的摄像头控制几个伺服。此外,它是套接字守护程序,它从任意客户端(在本例中为Android)获取命令。相机PTP很慢,我不想等待它完成它的任务,因为程序的其余部分需要响应。
我尝试过线程,但相机线程中的任何问题似乎都会扼杀整个过程。理想情况下,我想让相机自己去做它的事情,当它完成时,让主函数知道。这是一种合适的分叉技术吗?还是我实现线程的方式不正确?
此外,我希望远离大型的二级库,以避免比我已经有的更多的交叉编译问题。提前感谢您的任何建议。
发布于 2012-06-12 10:25:06
采用steveha的答案的基本方法,但跳过init(8)和命名管道。
fork()一个包含相机代码的孩子,并通过常规管道或域套接字进行通信。在parent.If中为SIGCHLD编写一个信号处理程序。孩子死了,用wait()返回的代码询问原因。如果它自己死了,则清除并重新启动它;如果它正常结束,则在这种情况下执行适当的操作。通过您最终选择的IPC与孩子进行交流。与init相比,这给了你更多对子进程的控制,尤其是域套接字或管道,这将使父进程和子进程之间的设置和通信变得更容易,而不是搞乱FIFO的时髦语义。
当然,如果相机代码真的有问题,你真正做的就是通过不删除整个程序来使失败变得更容易处理。理想情况下,如果相机代码在你的能力范围内,你应该让它完美地工作。
发布于 2012-06-12 09:19:17
您的问题听起来像是多个进程的典型案例,它们通过某种类型的进程间通信(IPC)进行通信。
相机应该有自己的进程,如果该进程死了,主进程应该不会有问题。您甚至可以让init(8)进程管理相机进程;如果该进程由于任何原因而终止,则可以自动重新启动该进程。
您可以永久设置命名管道,然后相机进程可以在失败后重新启动的任何时间重新打开它。
以下是有关命名管道的一些文档:
http://www.tldp.org/LDP/lpg/node15.html
我在维基百科的页面上找到了这个:
http://en.wikipedia.org/wiki/Named_pipe
我搜索了StackOverflow,发现了关于命名管道与套接字的讨论:
发布于 2012-06-12 10:33:14
我尝试过线程,但摄像头线程中的任何问题似乎都会终止整个过程。
当你说杀死整个过程时,实际发生了什么?
我告诉你,你最好调试上面的问题,而不是试图把bug包装在派生进程中。你宁愿有一个可靠的系统,包括一个可靠的摄像头,而不是一个可靠的核心系统,而不是一个不可靠的摄像头。
https://stackoverflow.com/questions/10989122
复制相似问题