天天看點

Cygwin使用指南

該文章修改自: http://wenku.baidu.com/view/2f0ffbfc910ef12d2af9e795.html 一、引言 cygwin是一個在windows平台上運作的unix模拟環境,是cygnus solutions公司開發的自由軟體(該公司開發了很多好東西,著名的還有eCos,不過現已被Redhat收購)。它對于學習unix/linux操作環境,或者從unix到windows的應用程式移植,或者進行某些特殊的開發工作,尤其是使用gnu工具集在windows上進行嵌入式系統開發,非常有用。随着嵌入式系統開發在國内日漸流行,越來越多的開發者對cygwin産生了興趣。本文将對其作一介紹。 二、基本原理 cygnus當初首先把gcc,gdb,gas等開發工具進行了改進,使他們能夠生成并解釋win32的目标檔案。然後,他們要把這些工具移植到 windows平台上去。一種方案是基于win32 api對這些工具的源代碼進行大幅修改,這樣做顯然需要大量工作。是以,他們采取了一種不同的方法——他們寫了一個共享庫(就是cygwindll),把win32 api中沒有的unix風格的調用(如fork,spawn,signals,select,sockets等)封裝在裡面,也就是說,他們基于 win32 api寫了一個unix系統庫的模拟層。這樣,隻要把這些工具的源代碼和這個共享庫連接配接到一起,就可以使用unix主機上的交叉編譯器來生成可以在 windows平台上運作的工具集。以這些移植到windows平台上的開發工具為基礎,cygnus又逐漸把其他的工具(幾乎不需要對源代碼進行修改,隻需要修改他們的配置腳本)軟體移植到windows上來。這樣,在windows平台上運作bash和開發工具、使用者工具,感覺好像在unix上工作。 關于cygwin實作的更較長的描述,請參考http://cygwin.com/cygwin-ug-net/highlights.html. 三、 安裝 關于cygwin安裝的更多内容請參照《 cygwin安裝詳解(上) 》 四、如何進入bash shell 可用通過programs->Cygwin->Cygwin Bash Shell或直接點選cygwin\Cygwin.bat來進入cygwin的bash shell視窗 五、 環境變量 DOS中的變量在bash中仍然可用。是以我們可以在開始運作bash之前,用DOS指令設定一些環境變量,然後在bash中使用它們。 cygwin提供了一個 Cygwin.bat 檔案,用于啟動bash。通過它來啟動bash是最安全的辦法。這個 Cygwin.bat 檔案安裝在cygwin所在的根目錄下,可以随意編輯該檔案。該檔案内容如下: Cygwin.bat檔案 @echo off D: chdir D:\tools\cygwin\bin bash --login -i 在該檔案中,首先通過DOS指令切換到cygwin\bin目錄,然後運作bash進入bash指令 我們可用在 Cygwin.bat 檔案設定一個DOS變量,比如: 示例1: Cygwin.bat檔案 @echo off set name=hb D: chdir D:\tools\cygwin\bin bash --login -i 然後我們在bash中執行 ehco $name 指令将顯示 hb PATH 變量被cygwin應用程式作為搜尋可知性檔案的路徑清單。當一個cygwin程序啟動時, 該變量将被從windows格式 (e.g. C:\WinNT\system32;C:\WinNT) 轉換成unix格式 (e.g., /WinNT/system32:/WinNT)。如果想在不運作bash的時候也能夠使用cygwin工具集, PATH 起碼應該包含x:\cygwin \bin,其中 x:\cygwin  是你的系統中的cygwin目錄。 HOME 變量用來指定主目錄,推薦在執行bash前定義該變量。當cygwin程序啟動時,該變量也被從windows格式轉換成unix格式,例如,作者的機器上HOME的值為C:\(dos指令set HOME就可以看到他的值,set HOME=XXX可以進行設定),在bash中用echo $HOME看,其值為/cygdrive/c. TERM 變量指定終端型态。如果沒對它進行設定,它将自動設為cygwin。 LD_LIBRARY_PATH 被cygwin函數dlopen()作為搜尋.dll檔案的路徑清單,該變量也被從windows格式轉換成unix格式。多數Cygwin應用程式不使用dlopen,因而不需要該變量。 另外我們可在 cygwin\etc\profile , cygwin\home\username\.bash_profile 這兩個檔案中用直接用bash指令設定bash變量。 前者在cygwin啟動時執行,後者将在username這個使用者登入時被執行。前者先執行,後者後執行,是以後者可用重寫前者。這裡的username是指登入使用者的使用者名。 比如在cygwin\home\h in\.bash_profile中設定NDK的安裝目錄 NDK=/cygdrive/d/SDK/android-ndk-r4b export NDK  六、改變cygwin的最大存儲容量 Cygwin程式預設可以配置設定的記憶體不超過384 MB(program+data)。多數情況下不需要修改這個限制。然而,如果需要更多實際或虛拟記憶體,應該修改系統資料庫的 HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER區段。添加一個DWORD鍵heap_chunk_in_mb并把它的值設為需要的記憶體限制,機關是十進制MB。也可以用cygwin中的regtool完成該設定。例子如下: regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024 regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin 這裡前一個指令把 /HKLM/Software/Cygnus\ Solutions/Cygwin 的子項 heap_chunk_in_mb 值設定為 1024 MB 後一個指令将顯示 /HKLM/Software/Cygnus\ Solutions/Cygwin 的所有子項的值 注意,這裡的 /HKLM/Software/Cygnus\ Solutions/Cygwin 表示” /HKLM/Software/Cygnus Solutions/Cygwin “因為有空格是以加” \ “ 另外,可以通過 regtool --help 指令檢視 regtool 指令的詳細内容。 七、 路徑 cygwin同時支援win32和posix風格的路徑,路徑分隔符可以是正斜杠也可以是反斜杠,還支援UNC路徑名 。( 在網絡中,UNC是一種确定檔案位置的方法,使用這種方法使用者可以不關心儲存設備的實體位置,友善了使用者使用。在Windows作業系統,Novell Netware和其它作業系統中,都已經使用了這種規範以取代本地命名系統。在UNC中,我們不用關心檔案在什麼盤(或卷)上,不用關心這個盤(或卷)所在伺服器在什麼地方。我們隻要以下面格式就可以通路檔案: \\伺服器名\共享名\路徑\檔案名 共享名有時也被稱為檔案所在卷或儲存設備的邏輯辨別,但使用它的目的是讓使用者不必關心這些卷或儲存設備所在的實體位置。 ) 符合posix标準的作業系統(如linux)沒有盤符的概念。所有的絕對路徑都以一個斜杠開始,而不是盤符(如c:)。所有的檔案系統都是其中的子目錄。例如,兩個硬碟,其中之一為根,另一個可能是在/disk2路徑下。 因為許多unix系統上的程式假定存在單一的posix檔案系統結構,是以cygwin專門維護了一個針對win32檔案系統的内部posix視圖,使這些程式可以在windows下正确運作。在某些必要的情況下,cygwin會使用這種映射來進行win32和posix路徑之間的轉換。 7.1 cygwin mount表 cygwin中的mount程式用來把win32盤符和網絡共享路徑映射到cygwin的内部posix目錄樹。這是與典型unix mount程式相似的概念。 路徑映射資訊存放在目前使用者的cygwin mount表中,這個mount table 又在windows的系統資料庫中。這樣,當該使用者下一次登入進來時,這些資訊又從系統資料庫中取出。mount 表分為兩種,除了每個使用者特定的表,還有系統範圍的mount表,每個cygwin使用者的安裝表都繼承自系統表。系統表隻能由擁有合适權限的使用者(windows nt的管理者)修改。 目前使用者的mount表可以在系統資料庫"HKEY_CURRENT_USER/Software/Red Hat, Inc./Cygwin/mounts v" 下看到。系統表 存在HKEY_LOCAL_MACHINE下。 注:我在系統資料庫中并沒看到這兩項。 posix根路徑/預設指向系統分區,但是可以使用mount指令重新指向到windows檔案系統中的任何路徑。cygwin從win32路徑生成posix路徑時,總是使用mount表中最長的字首。例如如果c:被同時映射成/c和/,cygwin将把C:/foo/bar轉換成 /c/foo/bar. 如果不加任何參數地調用mount指令,會把Cygwin目前安裝點集合全部列出。在下面的例子中, f:\cygwin 是POSIX根,而d盤被映射到/d。本例中,根是一個系統範圍的安裝點,它對所有使用者都是可見的,而/d僅對目前使用者可見。 c:\> mount f:\cygwin\bin on /usr/bin type system (binmode) f:\cygwin\lib on /usr/lib type system (binmode) f:\cygwin on / type system (binmode) e:\src on /usr/src type system (binmode) c: on /cygdrive/c type user (binmode,noumount) e: on /cygdrive/e type user (binmode,noumount) 還可以使用mount指令增加新的安裝點,用umount删除安裝點。 當Cygwin不能根據已有的安裝點把某個win32路徑轉化為posix路徑時,cygwin會自動把它轉化到一個處于預設posix路徑  /cygdrive 下的的一個安裝點. 例如,如果Cygwin 通路Z:\foo,而Z盤目前不在安裝表内,那麼 Z:\ 将被自動轉化成 /cygdrive/Z. 可以給每個安裝點賦予特殊的屬性。自動安裝的分區顯示為“auto”安裝。安裝點還可以選擇是"textmode"還是 "binmode",這個屬性決定了文本檔案和二進制檔案是否按同樣的方式處理。 注意 : cygwin\bin 預設會被系統映射為 /usr/bin ; cygwin\lib 預設會被系統映射為 /usr/lib , cygwin 目錄是做為 POSIX的根 7.2 路徑的自動轉化 cygpath工具提供了在shell腳本中進行win32-posix路徑格式轉換的能力。 HOME ,  PATH ,和 LD_LIBRARY_PATH 環境變量會在cygwin程序啟動時自動被從Win32格式轉換成了POSIX格式。 比如,“C:\WinNT\system32;C:\WinNT”(windows格式)轉換成“/WinNT/system32:/WinNT”(unix格式)

繼續閱讀