本章假設您已熟悉:
Solaris作業系統如何利用STREAMS以及ioctl和外部設備溝通。
termcap和terminfo如何支援不同的終端機類型。
請參閱termio(7)的線上援助頁中,有關STREAMS和TTY驅動程式的相關背景資訊。
在使用者的shell和終端機之間的資料路徑稱之為串流(stream)。在串流上的資料包含了字元和控制資訊。該控制資訊會影響資料的處理,如改變碼集或是通訊協定的控制碼。從終端機輸入串流的資料是未經處理的(raw),之後再依序經由串流模組處理後,交給shell或是應用程式使用。
串流(STREAMS)提供了將行的處理模組化的一種方式,如此可使處理的程序依功能合併成各個模組。這些模組可以隨時依使用者的需求不同而在行中增減,提供不同的環境給終端機。
傳統的STREAMS TTY環境包含了原始裝置驅動程式(raw device driver)、 文字行控制模組(line discipline module)、串流表頭(stream head)。原始裝置驅動程式在系統核心程式(kernel)和硬體之間提供了一個輸出入的介面。 因為它最接近實際的硬體,它提供了基本通訊協定、通訊速度切換、以及其他的低階服務。文字行控制模組是一些控制指令將原始資料(raw data) 轉成處理過的資料,其中包含了處理刪除(delete)字元、行清除(line kill)字元等功能。串流表頭在使用者的處理(process)和串流之間提供了一個介面。
繁體中文Solaris作業環境利用了STREAMS的特性支援繁體中文。除了傳統的 TTY模組外,此系統在STREAMS中處理碼的轉換。中文輸入通常是由許多的現有繁體中文TTY提供,因此繁體中文Solaris的TTY環境中沒有中文輸入。
繁體中文Solaris作業環境加強了既有的傳統模組。它的文字行控制可以正確地處理寬字元(widecharacter)的游標移動,以及一般的通訊協定。繁體中文Solaris軟體轉碼模組可在兩種不同的字碼格式(如Big5和EUC)之間轉換。
碼的轉換是根據和所設的相對應旗號或參數。例如,您使用的是Big5碼終端機。 從終端機的輸入會轉成EUC,而送到終端機的輸出會轉成Big5碼。
可以載入串流的主要模組是:ldterm和big5euc:
ldterm(7)是個一般性的EUC文字行控制模組。它能處理所有的標準文字行控制功能,同時也能正確地處理寬字元(EUC)的游標移動和倒退鍵。
big5euc控制Big5和EUC之間的轉碼。
ioctl(input/output control;輸出入控制)呼叫是處理裝置輸出入的低階常式。
termcap和terminfo資料庫能讓應用程式正確地設定終端機的顯示。
繁體中文Solaris作業環境利用ioctl(2)的STREAMS指令做一般性的 EUC處理。下列為這些ioctl呼叫以及他們的功能之摘要:
表 4-1 ioctl請求和說明
ioctl請求 |
說明 |
---|---|
EUC_WGET |
從TTY串流取得cswidth的值。 |
EUC_WSET |
設定TTY串流中cswidth的值。 |
EUC_OXLOFF |
設定轉碼為關閉(OFF)。 |
EUC_OXLON |
設定轉碼為開啟(ON)。 |
字元在終端機之間的轉碼是由EUC_OXLON和EUC_OXLOFF所控制。
termcap和terminfo是應用程式調整終端機特性所使用的資料庫。 下面所列為針對termcap資料庫所擴充的功能:
表 4-2 termcap變數及說明
變數 |
說明 |
---|---|
dv |
裝置種類:語言和碼集 |
ci |
對多種碼集的起始序列 |
s0 |
移至碼集0 |
s1 |
移至碼集1 |
s2 |
移至碼集2 |
s3 |
移至碼集3 |
下面所列為針對terminfo庫所擴充的功能。s0-s3的字串值是在終端機輸出入時,配合相對應的碼集,做為資料宣告機制之用。
表 4-3 terminfo變數和說明
變數 |
大寫名稱 |
Tc |
說明 |
---|---|---|---|
device_type |
devt |
dv |
裝置種類:語言和碼集。 |
code_set_init |
csin |
ci |
對多種碼集的起啟序列 |
set0_des_set |
s0ds |
s0 |
移至碼集0 |
set1_des_set |
s1ds |
s1 |
移至碼集1 |
set2_des_set |
s2ds |
s2 |
移至碼集2 |
set3_des_set |
s3ds |
s3 |
移至碼集3 |
兩個用於設定和使用TTY環境的指令是setterm與/bin/stty。setterm主要用來為特定終端機類型建立TTY串流,將需要的模組送到串流。stty能夠改變串流中模組的行為。
setterm用於設定TTY STREAMS環境。它可以查詢以及控制某一TTY通訊埠的 STREAMS模組。setterm讓使用者可以用系統內建或使用者自備之STREAMS模組,來調整他們的TTY STREAMS環境。
setterm用一終端機裝置名稱,為設定STREAMS模組給某TTY通訊埠,反應devt(裝置類型)欄位(位於terminfo資料庫)。此裝置名稱是對應setterm裝置檔/usr/share/lib/setterm/zh_TW/conf.file中的相同名稱之項。此項包含了如何載入和卸載模組的命令,以正確設定STREAMS的環境。
setterm同時也可直接接受裝置種類為參數。此裝置種類是和/usr/share/lib/setterm/zh_TW/conf.file中的項目很類似。
setterm 配置檔案是用一種特殊的語言來指定要執行的動作。此語言允許使用者決定 STREAMS 堆疊中模組的名稱、載入或卸載堆疊模組,以及其他的操作。 setterm 利用ioctl 呼叫控制 STREAMS 堆疊。
繁體中文 Solaris 作業環境提供了特殊用途之模組,來關閉或開啟轉碼,以及適當地處理多位元組( multibyte )與寬( wide )字元。載入某一個模組後, 就開啟了相對應的轉換。轉換的內定狀態是開啟的。
請參閱setterm(1)線上援助頁中的有關說明。
-defeucw選項(用於/bin/stty指令)可用來修改STREAMS的模組來配合使用者環境的改變。該選項不能用於/usr/ucb版本的stty,因為它並沒有做過國際化(internationalized)的處理。
下列指令會查詢使用者環境中的EUC碼集寬度,同時設定文字控制中相對應的資訊:
system% /bin/stty defeucw |
例如,如果使用者有設定LC_CTYPE環境變數到區域環境, 透過此選項就能知道在zh_TW環境下的碼集中,每個字元是幾個位元組,以及每個字在螢幕上的寬度如何等等,然後將這些訊息送至串流中的相關模組。
系統管理者可以把setterm的指令加在/etc/rcn.d目錄(n是執行層次)下的啟動指令集中(startup script),在系統啟動時就可執行。另外,使用者可以在登入時,執行指令setterm指令 設定其終端機串流,包括適合的繁體中文輸入轉碼模組。下面的範例setterm是在系統提示下當成指令輸入,或是放在如.cshrc、.login的系統檔案、或是啟動指令集中。這些命令可以明確地指定裝置類別,或是使用terminfo資料庫。
使用下列的指令,明確地命令STREAMS模組使用Big5終端機:
setterm -x big5 |
此一用法和terminfo無關。
又假設在一個terminfo資料庫中有如下項目的系統上, 使用VT-100終端機(它和Big5相容):
vt100-b|VT-100-compatible with Big-5 chars, lines #40, .csin=E(BE)IE[?1h, csin=E(BE)I, devt=PACKBig5, s0ds=E(H, s1ds=E$@, s2ds=E(H, use=cit600, |
和此項目相配合的設定指令為:
setterm -t vt100-b |
如果要setterm在這種用法中正常運作,/usr/share/lib/setterm/zh_TW/conf.file中必須要有項目對應到這類裝置。此項目告訴setterm如何在TTY串流中載入適當的轉換模組。例如:
# big5throw \ popto zs|mcp|mti|ptem \ push big5euc \ push ldterm \ push ttcompat \ run {stty defeucw} \ catch # GenericEUC|EUCthrow \ popto zs|mcp|mti|ptem \ push ldterm \ push ttcompat \ run {stty defeucw} \ catch # ASCIIthrow \ popto zs|mcp|mti|ptem \ push ldterm \ push ttcompat \ catch # |
請參閱setterm(1)的線上援助頁的進一步說明。當設定好後,轉換就會依內定生效。應用程式亦可透過ioctl()的函數呼叫設定功能。
繁體中文Solaris作業環境支援Big5終端機。這些終端機必須有內建的繁體中文字型和輸入法。
如果之前您還沒有加入終端機到系統中,首先試著以ASCII模式安裝終端機。請參閱Solaris System Administration Guide中進一步的說明。
您可以從管理工具選單中選取「串列通訊埠」,設定終端機所用的串列埠。 「串列通訊埠」提供了最簡單的方法安裝終端機。「串列通訊埠」是透過admintool呼叫。請參閱Solaris System Administration Guide中有關admintool的進一步說明。
安裝支援CNS 11643的中文終端機之方法和安裝ASCII終端機一樣。
從「串列通訊埠」選單選擇「編輯」。
會出現「串列通訊埠:修正串列通訊埠」的子選單。
在「管理工具:修正串列通訊埠」的子選單上,選擇「啟動服務」、「通訊速度 9600」,並輸入終端機種類。
在「專家選項」下,選取"建立utemp項目",並在「串流模組」欄中輸入適當的模組。
欲在繁體中文Solaris作業環境下安裝支援Big5碼的終端機,請在「串流模組」欄中輸入big5euc。
下列步驟是透過指令行把終端機設定在ttya所需之程序:
決定通訊埠監控器的版本號碼。
這樣會顯示監控器的版本號碼。
# ttyadm -V |
輸入下列指令。將版本代換成監控器的版本號碼。
(請參見sacadm(1M)和pmadm(1M)線上援助頁的進一步相關說明。 )
# pmadm -r -p zsmon -s ttya # sacadm -a -p zsmon -t ttymon -c /usr/lib/saf/ttymon -v 版本 |
利用配合您的終端機種類的pmadm命令新增登入(login)服務:
如果您使用的是EUC終端機,請用下列指令:
# pmadm -a -p zsmon -s ttya -i root -fu -v 版本 -m " `ttyadm -S y \ -T terminal_type -d /dev/ttya -l 9600 -m ldterm,ttcompat -s \ /usr/bin/login` " |
如果您是使用Big5碼的終端機,請用STREAMS模組big5euc(在ttyadm指令):
# pmadm -a -p zsmon -s ttya -i root -fu -v 版本 -m "`ttyadm -S y \ -T terminal_type -d /dev/ttya -l 9600 -m big5euc,ldterm,ttcompat -s \ /usr/bin/login` " |
打開終端機。
請依照終端機所附之文件進行。
登入終端機。
檢查安裝是否正確:
# setenv LANG 區域環境 # /bin/stty cs8 -istrip defeucw |
這些值表示作業系統和終端機的溝通是設定在"8位元無同位檢查 (8-bit no-parity)"的模式。請確定終端機是設定在"8位元無同位檢查"模式。有關如何正確設定終端機的選項,請參閱終端機的設定手冊。
檢查您的TTY是否正確地設定了:
輸入指令/bin/stty,同時使用選項-a:
system% /bin/stty -a |
如果上述之值(cs8, -istrip)沒有列出來,請使用下述指令設定它們:
system% /bin/stty cs8 -istrip defeucw |
這是設定終端機的最後一步。