歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 將OS/2應用程序移植到Linux(2)

將OS/2應用程序移植到Linux(2)

日期:2017/2/27 9:48:35   编辑:更多Linux

  作者:Kevin Bowkett
  
  實現一個與 OS/2 (它進行一些邊界檢查)類似的行為的另一個方法是使用文件映射。文件映射將一個文件映射到一個進程的內存空間內,以便允許把文件像內存一樣來訪問。沒必要整個文件映射到內存,但可以把文件的一部分映射到一個內存區域。
  
  共享內存機制的另一個差別是:當一個段被加載到一個進程中時,Linux 不保證會使用相同的內存地址。在 OS/2 上,您可以分配一塊內存並將這一塊內存傳送給另一個進程。內存位於每個進程中相同的地址處。在 Linux 上情況並不一定如此。另外,為了訪問另一個進程已創建的一個共享內存段,您需要知道這個段的標識。標識是一個獨一無二的數字,可以通過使用一個名稱(如果該名稱作為一個文件存在)來計算這個數字。OS/2 提供幾個系統調用,使得進程能夠給出且獲得到基於名字或內存地址的共享內存段的訪問。
  
  隊列
  
  OS/2 隊列是一個允許進程把內存指針傳給另一個進程的機制。傳送進程必須通過 DosGiveSharedMemory 給接受進程提供到內存段的訪問,然後把內存在段中的位置傳送給接收進程。像機制名暗示的一樣,隊列可以在等待另一個進程讀取它們的同時保存大量的這些內存位置。Linux 沒有這個概念。
  
  在可能的解決方案中,其中之一就是使用 System V 共享內存段。System V 共享內存段的問題是限制了被允許的段的數量。
  
  另一個方法是使用文件映射並使用控制結構,該結構設置元素(內存位置)的順序和對文件的訪問權限。
  
  信號量(Semaphore)
  
  OS/2 提供三種主要類型的信號量:事件、互斥和多等待。Linux 提供一個基於 System V IPC 的信號量機制並且支持信號量作為 pthread 庫的一部分。OS/2 信號量是一個單獨的實體,給您提供一個定義良好的行為。然而,可以將 System V 信號量定義成幾組,這是可配置的。在不重新編譯內核的情況下,每個組最多可以有 250 個信號量(2.4 內核)。這種系統在系統內只能有一定數量的信號量組(可以通過重編譯內核來更改這個數量)。
  
  System V 信號量基本上是計數變量,您可以增加或減少這些變量,並且這為您模仿事件信號量和互斥信號量的行為提供了足夠的功能。唯一的問題是執行定時等待。在 Linux 上,您只能嘗試/等待或等待。不允許超時。為了模仿超時,您需要構建某種定時機制,該機制能發送一個信號來中斷正在等待一個事件的線程。
  
  多等待信號量是一個已定義信號量的集合,這些信號量可以作為一組等待。System V 機制利用組,並且能等待許多與同一個組相關的操作。然而,只有應用程序仔細地規劃了它對信號量(多等待中的所有信號量都來自於同一個信號量組)的使用,您才能得到期望的結果。我們實現了一個機制,它使線程能夠等候這組內的每個信號量來模擬這一行為。
  
  pthread 庫提供了能合理模仿 OS/2 行為的信號量和互斥(以及條件變量)。然而,還存在缺陷。請注意,pthread 信號量和互斥是不可共享的。換言之,僅在那個進程中保證它們。如果您的應用程序僅使用私有信號量,或者如果沒有其它進程需要訪問它的信號量,那麼使用 pthread 互斥和信號量可能是最好的計劃。但是,如果您的應用程序共享這些 IPC 機制,那麼您需要用 System V 機制、共享內存和線程來實現這些機制。
  
  信號
  
  在OS/2上,為了指明某些錯誤情況,要拋出異常。在 Linux 上,這些被稱為信號。與異常一樣,除了 SIGKILL 和 SIGSTOP 之外,信號都可以被捕獲。在 OS/2 上,您可以定義一列在接收到異常時需要執行的函數。應用程序可以在 OS/2 上定義不止一個異常處理程序。在 Linux 上,因為函數被覆蓋了,所以您只能定義一個異常處理程序。
  
  管道
  
  在 OS/2 上,管道是雙向的,而 Linux 上的管道是單向的。為了模仿 OS/2 管道的行為,您需要創建兩個管道,通過一個文件句柄來索引。
  
  共享對象
  
  Linux共享對象和DLL非常相似,但是需要注意幾個陷阱。應用程序可以在一個共享對象中重寫函數。如果一個共享對象有 print_hello 函數並且應用程序有一個叫作 print_hello 的函數,那麼無論何時應用程序調用 print_hello,都使用應用程序的版本。您在共享對象中調用一個函數之前(例如,so_print 調用 print_hello),這可能聽上去不像什麼問題。這種情況中使用的 print_hello 是應用程序中定義的那個。
  
  感覺上的標准函數
  
  您在作關於標准 C 函數方面的假設時應該謹慎一些。例如,kbhit 和 strupr 不是標准函數。盡管它們可能是一個編譯器的 C 標准庫的一部分,但是假定這些函數和其它函數存在於所有平台上是不安全的。
  
  
  結束語
  
  
  前面所述的差別無論如何不包含一個確定的列表。這樣一個列表中包含的信息足夠寫一本書了。然而,當您將一個應用程序從 OS/2 移植到 Linux 上時,這些差別應該使您可以提前找到需要解決問題的地方。
  
  LANDP for Linux 小組設計了一個映射層來幫助我們從 OS/2 向 Linux 移植。映射層是一個共享對象,用於從 OS/2 移植各個 LANDP 服務器。可能映射層將為其它項目提供一個起點,也許不會提供。
  
  關於作者
  
  Kevin Bowkett 是一名在 LANDP 開發組中工作的 IBM 軟件工程師,在 Linux、Windows 和 OS/2 操作系統方面有很好的基礎。在過去的一年中,Kevin 帶領 LANDP 小組將 LANDP for Linux 投入了市場。Kevin 還是一名獲 IBM 認證的 DB2 應用開發解決方案專家。如果您正在從事從 OS/2 到 Linux 的移植並且有什麼問題的話,可以和他聯系。



  
  『引自 IBM DW中國』



Copyright © Linux教程網 All Rights Reserved