您在问一个关于如何协调多个流程的非常普遍的问题。这是一个广泛而深刻的主题,您可以采取许多路线。这里有一些想法:
1)在 /var/lock 中创建一个锁定文件。这将适用于使用串行端口的其他程序。当一个程序完成后,其他程序将竞相创建锁,随机一个将获胜。
2)让你的图书馆创建一个共享内存段。在共享内存段中,写下谁拥有“锁”。与锁文件一样,您需要记下 PID,以便在所有者死亡时其他人可以窃取锁。这具有最少的开销。
3) 将您的串行代码拆分为“UART 控制守护程序”和调用该守护程序的客户端库。守护进程侦听 unix 套接字(或 TCP/UDP 或其他 IPC)并专门处理串行端口。(您可以轻松找到用任何语言编写的“聊天服务器”代码)。这有几个优点:
- 守护进程可以告诉调用者有多少请求“在队列中”
- 守护进程可以尝试维护 FIFO 顺序,或者在需要时处理优先级请求。
- 当多个客户端同时询问同一个问题时,守护进程可以缓存响应。
- 如果你不想让守护进程一直运行,你可以让 xinetd 启动它。(确保它处于单服务器模式。)
- 它使用更简单的标准 unix 套接字(或 TCP),而不是每个进程都必须链接到串行库。
- 你的 API 调用程序变得更容易测试(不需要硬件,你可以模拟响应)
- 如果 API 调用程序死掉,UART 不会处于错误状态