2011-08-09 28 views
1

我試圖通過將簡單的C++工具移植到Ada來學習Linux上的Ada。Linux上的Ada IO Multiplexing

現在我試圖編寫一個簡單的串行通信程序,發送調制解調器命令,並等待使用select調用發信號的文件描述符。

我似乎無法找到包含select調用的包 - 我必須在這裏尋找一些特定於平臺的包嗎?我在哪裏可以找到這個?我甚至在這裏尋找正確的東西嗎?

+0

我認爲答案取決於您試圖與之交談的串行通信接口的性質。對於TCP/IP套接字,GNAT.Sockets會給你你所需要的東西(儘管它是編譯器特有的)。在我們知道串口的本質之前,很難說一個有信號的文件描述符需要什麼。 –

+0

我只是發送調制解調器命令並等待該文件描述符的回覆。但正如T.E.D.下面提到,也許最好放棄這一點,並看看任務。我想做「阿達」的方式,但不知道在哪裏看。 – zeroc8

回答

1

select()是特定於Unix的操作系統調用,因此不屬於Ada的標準庫。

您將需要找到一個提供Unix系統調用接口的(非標準)包,使用接口編譯指示自己包裝它,或採取不同的方法。

對於第一個選項,我只能提供一點幫助,因爲我沒有Unix系統。一個Posix包應該有它,我相信你可以找到一個這樣的package (Florist) for Gnat here。我不能說它的質量。

要製作自己的綁定,您需要查看Appendix B of the LRM中爲此提供的設施。儘管這是一個高級主題,除非您知道很多關於您的操作系統如何執行其子例程鏈接或準備學習的內容,否則不應嘗試。

對於「不同的方法」,請查看您使用的任何參考指南對Ada的任務和/或受保護對象的說明(不要與C++中的protected關鍵字混淆)。例如,您可能希望有一項任務的唯一工作是從串行端口讀取傳入數據。您可以通過集合點在讀取之間進行同步,或者通過受保護的對象實現一個隊列來獲得真正的性感。

+0

謝謝,我會研究第二種方法,看起來更Ada'ish。 – zeroc8

+0

嗯,如果你使用底層的操作系統接口來執行一項任務,那麼你最終會遇到很多醜陋的非Ada代碼。我不確定花旗是多麼低級。 OTOH,Ada可以用作低級系統編程語言,如果這是你的願望。 –

+0

另請參閱此[問與答](http://stackoverflow.com/questions/6928285/how-to-bind-to-opencv-for-gnat)。 – trashgod