2013-07-25 9 views
0

我想使用共享庫並行運行多個進程。我的庫包含UART open/write/read/close,每個進程寫入一個特定的UART命令並期待相關響應。應用程序調用LIB中的API,Inside API打開UART端口,向UART寫入命令並從UART讀取響應,處理響應緩衝區併發送回用戶[API需要2到3秒才能執行]。多個不相關的進程同步UART

我有30個這樣的API和5個進程同時使用這些API運行。

如何跨所有這些進程提供同步,以便一次只能使用一個進程使用UART,而使用UART進行所有其他模塊。

Regards &謝謝, Anil。

回答

1

你在問一個關於如何協調多個過程的非常普遍的問題。這是一個廣闊而深刻的主題,你可以採取很多路線。這裏有一些想法:

1)create a lock file in /var/lock。這將與其他使用串口的程序一起工作。當一個程序完成後,其他人將比賽創建鎖定,隨機獲得一個。

2)讓您的圖書館創建一個shared memory segment。在共享內存段中,記下誰擁有'鎖'。與鎖定文件一樣,您需要記下PID,以便其他人可以在擁有者死亡的情況下竊取鎖定。這具有最小的開銷。

3)將你的串行代碼分成一個「UART控制守護進程」和一個調用守護進程的客戶端庫。守護進程監聽unix套接字(或TCP/UDP或其他IPC)並專門處理串行端口。 (您可以輕鬆找到用任何語言編寫的'聊天服務器'代碼)。這有幾個優點:

  • 守護進程可以告訴來電者多少請求「隊列」是
  • 守護進程可以嘗試維持FIFO順序,或處理優先權請求,如果它想。
  • 當多個客戶端同時詢問同一個問題時,守護進程可以緩存響應。
  • 如果你不想守護進程一直在運行,你可以讓xinetd啓動它。 (確保它處於單一服務器模式。)
  • 而不是每個進程都必須鏈接到串行庫,它使用更簡單的標準unix套接字(或TCP)。
  • 你的API調用的程序變得更容易測試(無需硬件,你可以模擬響應)
  • 如果API調用程序死亡,UART不是在一個糟糕的狀態留