linux系统,两个rs485端口,这两个端口连接~50台设备。 来自linux本身的系统中有大约100个进程。 4个核心臂。 从很多方面来说,它就像是运行我们应用程序的Linux桌面。 可能会很忙,例如就像你在linux上开办公室一样。
原创设计是这样的,也经过充分测试, 主应用程序有10个线程。 对于每个rs485,主进程产生一个监视所有进程的进程 这个设备 港口。 (由于这是串行总线,它基本上是一个执行tx / rx的for循环 每个设备1乘1.我们没有锁定两个rs485进程。) 总共3个过程。 每个rs485进程都没有相互通信,它们只与main通信 通过命名管道进行处理
现在ppl要求我更改为使用线程。所以只有1个进程,12个线程。 有了这个rs485线程崩溃没有线索,没有核心文件。 Ppl一次又一次地看着代码,仍然一无所知。
他们不想回去处理,因为 1.具有相同名称的3个进程令人困惑。 2.我们不知道如何将gdb附加到要调试的进程。如果只有1 过程,它更容易。
如果你们可以帮助我这些
Q1:我认为我们可以更改流程名称,对吗? 或为每个流程创建pid文件,我不熟悉这些文件。
Q2:如果你有3个同名的进程,调试有多难? 特别是我想调试子进程, 如何在gdb中执行此操作? 我可以在代码中设置断点,说这是child,在fork()之后?
如果我在fork()之后更改子进程名称会发生什么,我该如何调试子进程?
问题3:为什么线程可以在没有核心文件的情况下死掉,而主进程/线程可以 总是生成代码文件?
问题4:如果在这种情况下使用线程而不是进程,你会得到什么? (在我看来,只会遇到麻烦。)
Q5:通过线程或进程命名管道,性能差异很大?非常感谢!
答案 0 :(得分:0)
开发多线程应用程序要困难得多,可能是你团队的早期开发。回到单独的流程方法。
1)什么?
2)通过pid将gdb附加到正在运行的进程
3)你可以直接在线程,共享内存之间传递数据
4)命名管道在两种情况下都很慢,不需要带线程
答案 1 :(得分:0)
Q1 - 进程名称只是可执行文件的名称。你可能不想改变它。您可以跟踪pid文件中每个实例的pid。
Q2 - 在不同的进程中处理事情应该使调试更容易,因为它减少了潜在的交互。请注意,这是一个非常主观的意见。 Gdb可以使用命令行选项将pid附加到。
第三季 - 这将取决于为什么事情正在消亡。除非您正在使用信号处理程序,否则Seg故障和类似情况应导致两者都终止。Q4 - 当有大量的活动间通信或同步或大量的创建/破坏时,线程往往更有效率。
第五季 - 不明白为什么会有任何重大差异。在一种情况下,图片的某些部分会更快,但我希望最终结果是收支平衡。编辑:正如Basilevs建议的那样 - 回到流程。它们更容易使用,并且让它们以前工作过。