首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux中的并行处理

linux中的并行处理
EN

Stack Overflow用户
提问于 2012-06-12 08:23:07
回答 3查看 921关注 0票数 6

我不确定如何在我正在编写的程序中处理异步任务,我希望更有经验的人至少能为我指明正确的方向。

我在嵌入式ARM处理器上运行Angstrom Linux。我的程序通过暴露的硬件PWM和PTP上的摄像头控制几个伺服。此外,它是套接字守护程序,它从任意客户端(在本例中为Android)获取命令。相机PTP很慢,我不想等待它完成它的任务,因为程序的其余部分需要响应。

我尝试过线程,但相机线程中的任何问题似乎都会扼杀整个过程。理想情况下,我想让相机自己去做它的事情,当它完成时,让主函数知道。这是一种合适的分叉技术吗?还是我实现线程的方式不正确?

此外,我希望远离大型的二级库,以避免比我已经有的更多的交叉编译问题。提前感谢您的任何建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-12 10:25:06

采用steveha的答案的基本方法,但跳过init(8)和命名管道。

fork()一个包含相机代码的孩子,并通过常规管道或域套接字进行通信。在parent.If中为SIGCHLD编写一个信号处理程序。孩子死了,用wait()返回的代码询问原因。如果它自己死了,则清除并重新启动它;如果它正常结束,则在这种情况下执行适当的操作。通过您最终选择的IPC与孩子进行交流。与init相比,这给了你更多对子进程的控制,尤其是域套接字或管道,这将使父进程和子进程之间的设置和通信变得更容易,而不是搞乱FIFO的时髦语义。

当然,如果相机代码真的有问题,你真正做的就是通过不删除整个程序来使失败变得更容易处理。理想情况下,如果相机代码在你的能力范围内,你应该让它完美地工作。

票数 1
EN

Stack Overflow用户

发布于 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,发现了关于命名管道与套接字的讨论:

IPC performance: Named Pipe vs Socket

票数 3
EN

Stack Overflow用户

发布于 2012-06-12 10:33:14

我尝试过线程,但摄像头线程中的任何问题似乎都会终止整个过程。

当你说杀死整个过程时,实际发生了什么?

我告诉你,你最好调试上面的问题,而不是试图把bug包装在派生进程中。你宁愿有一个可靠的系统,包括一个可靠的摄像头,而不是一个可靠的核心系统,而不是一个不可靠的摄像头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10989122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档