0

我想使用同时运行多个进程的共享库。我的库包含 UART 打开/写入/读取/关闭,每个进程写入一个特定的 UART 命令并期望相关响应。应用程序调用 LIB 中的 API,API 内部打开 UART 端口,向 UART 写入命令并从 UART 读取响应,处理响应缓冲区并发送回用户 [API 执行需要 2 到 3 秒]。

我有 30 个这样的 API 和 5 个使用这些 API 同时运行的进程。

如何在所有这些进程之间提供同步,以便一次只有一个进程使用 UART,而 UART 上的所有其他块。

问候和感谢,阿尼尔。

4

1 回答 1

1

您在问一个关于如何协调多个流程的非常普遍的问题。这是一个广泛而深刻的主题,您可以采取许多路线。这里有一些想法:

1)在 /var/lock 中创建一个锁定文件。这将适用于使用串行端口的其他程序。当一个程序完成后,其他程序将竞相创建锁,随机一个将获胜。

2)让你的图书馆创建一个共享内存段。在共享内存段中,写下谁拥有“锁”。与锁文件一样,您需要记下 PID,以便在所有者死亡时其他人可以窃取锁。这具有最少的开销。

3) 将您的串行代码拆分为“UART 控制守护程序”和调用该守护程序的客户端库。守护进程侦听 unix 套接字(或 TCP/UDP 或其他 IPC)并专门处理串行端口。(您可以轻松找到用任何语言编写的“聊天服务器”代码)。这有几个优点:

  • 守护进程可以告诉调用者有多少请求“在队列中”
  • 守护进程可以尝试维护 FIFO 顺序,或者在需要时处理优先级请求。
  • 当多个客户端同时询问同一个问题时,守护进程可以缓存响应。
  • 如果你不想让守护进程一直运行,你可以让 xinetd 启动它。(确保它处于单服务器模式。)
  • 它使用更简单的标准 unix 套接字(或 TCP),而不是每个进程都必须链接到串行库。
  • 你的 API 调用程序变得更容易测试(不需要硬件,你可以模拟响应)
  • 如果 API 调用程序死掉,UART 不会处于错误状态
于 2013-07-25T13:13:46.550 回答