【问题标题】:Parallel processing in linuxlinux中的并行处理
【发布时间】:2012-06-14 21:22:10
【问题描述】:

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

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

我已经尝试过线程,但是相机线程中的任何问题似乎都会杀死整个过程。理想情况下,我想自己送相机去做它的事情,当它完成时让主要功能知道。这是一种适当的分叉技术还是我不正确地实现了线程?

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

【问题讨论】:

  • 为什么不在新进程中运行呢?然后通过套接字进行通信?
  • 我使用高级 Linux 编程作为我的指南...它不包括 clone() 函数。似乎是适当的技术
  • 可能是。或者它可能是system()。也看看那个。

标签: c linux multithreading


【解决方案1】:

您的问题听起来像是多进程的经典案例,通过某种进程间通信 (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

【讨论】:

  • 那个 UNIX 和 Windows 文档严重误导了有关 unix 管道的信息。 popen 不是系统调用,绝不保证管道是双向的(Linux 管道不是),mknod 用于特殊文件,而不仅仅是本文档误导性声称的管道。
  • 哇,这显示了快速谷歌搜索和快速浏览文档的危险。对于发布错误链接,我向大家道歉。我现在会从我的答案中编辑它。
【解决方案2】:

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

fork() 包含您的相机代码并通过常规管道或域套接字进行通信的子级。在父级中为 SIGCHLD 编写信号处理程序。如果子级死亡,请使用来自wait() 的返回码询问原因。如果它自行死亡,则清理并重新启动它;如果它正常结束,则在这种情况下执行适当的操作。通过您最终选择的任何 IPC 与孩子沟通。与init 相比,这使您可以更好地控制子节点,尤其是域套接字或管道,与搞乱 FIFO 的时髦语义相比,它更容易在父子节点之间设置和通信。

当然,如果相机代码确实存在问题,那么您真正要做的就是通过不删除整个程序来使故障更易于管理。理想情况下,您应该让相机代码在您的能力范围内完美运行。

【讨论】:

  • 相机代码有效……我的用词很差。例如,如果没有连接摄像头,则摄像头线程返回,并且无论出于何种原因,都会在程序中引入分段错误。你对 clone() 函数有什么看法?
  • 克隆不会为您做任何事情。线程和叉子都只是克隆的包装器。如果您遇到问题,那么降低一个级别并不能解决您的问题。也许您应该在另一个问题中发布您的线程代码的基础知识。您可能会犯一个非常简单的错误。
  • 感谢大家的帮助。使用带有简单管道的叉子,一切都如我所愿。我喜欢信号处理程序发现子进程状态的想法。
【解决方案3】:

我已经尝试过线程,但是相机线程中的任何问题似乎都会杀死整个进程。

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

我告诉你,你最好调试上述问题,而不是试图将错误包装在一个分叉的进程中。你宁愿拥有一个可靠的系统,包括一个可靠的摄像头,而不是一个可靠的核心系统和一个不可靠的摄像头。

【讨论】:

  • 一个返回0;引入了分段错误
  • @CountZero:gdb 说当时堆栈上的内容是什么?哪一行代码导致了seg错误?
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2013-01-05
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多