close

本文出自於 TEST104 台北考題大師<<在進程中利用Open命令打開文件>>

 

在進程中利用Open命令打開文件[2009/5/15]

 
 
    Unix系統工程師在開發腳本程式的時候,往往需要在進城中利用Open函數打開某個檔。如在編寫一個安裝程式的時候,可能需要從一個配置檔中獲取相關的參數。此時,就是在安裝進程中打開檔。這個時候是不能夠使用vi等系統命令的。而需要通過Open等系統調用來實現。其實在使用vi命令打開編寫某個檔時,其後臺也是通過open系統調用來實現的。


    一、Open命令的基本功能。
    在進程中調用Open命令的格式為:int open (const char *pash,int oflag,…..)。這個open命令不僅可以打開檔,還可以創建檔。如果檔存在,則Open命令會打開這個檔;而如果檔不存在的話,則Open命令會創建這個檔。我們看到,在Open命令前面有一個Int關鍵字,他表示採用Open命令後系統會返回一個檔描述符,它是一個整數的值,一個可以分配的最小整數。它就好像是另外一個形式檔案名字,當使用Open命令打開某個檔,然後採用Close命令關閉檔時就需要用到這個檔描述符。在編寫腳本程式的時候,系統工程師需要清楚,在什麼時候需要用到這個Open命令來打開檔。如果腳本程式只需要用到檔的屬性,如編寫一個檔備份程式需要用到檔的修改時間這個屬性,那麼此時是不需要利用Open命令的。因為這個時間屬性不是保存在檔中,而是保存在Inode中。所以系統工程師就需要瞭解,哪些是保存在檔中,而哪些內容是沒有保存在檔裏的。通常情況下,關於檔的全部屬性,如所有者、修改時間、許可權等屬性都不識保存在檔中的。進程訪問這些資訊時,不需要利用Open命令打開檔。只有對檔本身的內容進行操作,如需要對某個檔進行讀寫操作時,才需要使用Open命令。最常見的如在安裝程式的過程中,會往相關檔中寫入安裝日誌。


    二、檔打開方式。
    在利用Open命令來打開檔,跟採用Vi命令等不同,需要顯示的表明以什麼方式來打開檔。如某個安裝程式,需要打開某個配置檔,則需要指明是以唯讀方式來打開呢,還是以讀寫方式來打開這個檔。在Open命令的參數種,採用了三個符號常量來表示三種不同的打開模式。符號常量O_RDONLY表示打開檔只用於讀操作;符號常量O_WRONLY表示打開檔只用於寫操作;符號常量O_RDWR表示打開檔用於讀寫操作。為了防止對檔的意外操作,往往需要以合適的方式來打開檔。如某個安裝進程,只需要從配置檔中讀取參數,而不會往其中寫入內容的話,則最好以O_RDONLY唯讀方式來打開。如在安裝時需要往一個檔中寫入安裝日誌的話,則可以以O_WRONLY只寫模式打開。可見在部署相關檔的時候,也最好能夠做到檔專用。每個檔只負責一個特定的用途,這有利於提高這些檔的重複利用。
    這些常量是定義在fcntl.h文件中的。所以往往需要在應用程式碼的開頭插入#include語句。只有如此應用程式才能夠識別這些常量所代表的含義。筆者再次強調一次,採用Open命令打開檔時必須顯示的指名檔打開的類型。為了提高配置檔不被意外損壞,在使用Open命令打開文件時要以最小許可權來打開。


    不過光這些檔打開模式往往還不能夠滿足系統工程師的需要。如我們編寫了一個檔備份程式。每次檔備份完畢後,我們都要讓這個備份程式往日志檔中加入這次備份的相關資訊。如備份程式運行從什麼時候開始到什麼時候結束,備份了哪些檔等等。這些資訊有利於我們日後進行維護與性能的調整。為此我們就需要這個備份程式以追加的方式往原有的日誌檔中存入相關的紀錄。為了完成這些特殊的功能,Unix操作程式中預定義了一些常用的功能,而不需要我們系統管理員通過複雜的編碼來實現。為了滿足不同的需要,Unix操作內核一共提供了如下這些功能。跟打開模式一樣,也是採用常量來代表不同的功能。如符號常量O_APPEND表示以追加模式打開檔(注意檔的打開模式不能夠為唯讀);如符號常量O_EXCL表示若檔存在且使用O_CREAT模式打開的話,則會返回一個錯誤代碼,這可以防止檔被強制覆蓋;如符號常量O_SYNC表示讀寫操作同步執行,也就是說一定要在資料寫入到磁片之後才允許Write命令返回,這可以確保修改的內容保存到了硬碟中,而不知在記憶體中。當系統工程師需要打開檔完成特定的功能時只需要調用相關的字元常量即可。而不需要另外編寫代碼來實現。這提高了系統工程師開發程式的效率。這些常量在不同的Unix作業系統中是通用的,為此也不用擔心相容性問題。如現在要以追加的形式打開一個檔,以保存每天的備份資訊。此時可以使用如下的形式來打開這個檔:
    Open(“backlist.txt”,O_WRONLY|O_APPEND
    這個命令就表示以只寫的方式打開backlist.txt,並以追加的方式往檔中追加相關的日誌資訊。此時相關的資訊會從檔的末尾為只開始寫入。也就是說,採用這個功能後,在打開檔時系統會自動把指標設置在檔的結尾部分。之後的檔寫入操作就不會覆蓋原先的內容,而只是會不斷的往檔的末尾追加紀錄,檔的大小也會隨之增大。注意檔打開模式與功能字元常量之間是用|符號來分隔的。另外Open命令的第一個參數就是需要打開檔的路徑與檔案名字。這個路徑可以是絕對路徑也可以使相對路徑。不過最好還是採用相對路徑,如此的話應用程式位置的改變不會影響到Open命令中的路徑。


    三、讓多個進程共用一個檔。
    當利用Open命令打開一個檔,而這個命令中又帶有O_CREAT字元常量,則如果檔不存在,系統會創建一個檔;如果檔存在的話,則就會覆蓋掉原先的文件。為此在使用O_CREAT這個功能的時候,系統工程師需要注意,原先的檔是否不需要了。通常情況下只有在程式安裝日誌管理中才會使用O_CREAT這個常量。因為第一次的安裝日誌在第二次安裝過程中往往沒有什麼作用。為了便於管理員查看安裝日誌,就直接把前一次的安裝日誌刪除了。
    不過在大部分情況下,採用O_CREAT方式並不是很好的選擇。如當某個進程同時訪問一個檔時,如果其中一個檔利用O_CREAT功能覆蓋了整個檔,那麼就會對其他進程的訪問產生致命的影響。為了提高多個進程共用一個檔的和諧性,系統工程師需要在Open命令中使用O_Excl功能。它可以限制在訪問的過程中其他進程採用O_CREAT功能覆蓋著檔。這就是一種多進程共用同一個檔的鎖機制。


    如當某個進程在訪問backlist.txt檔時,在還沒有把更新的內容寫入到這檔之前會先給這個檔加一個鎖;寫入完成後再把這個鎖去掉。如果在Open操作使用了O_Excl功能,則只有第一個Open調用才會成功,而其他的Open調用不會成功。也就是說,在同一個時間內,只有一個進程可以打開這個檔,以防止檔的錯讀。這比通過許可權來控制要好的多。因為此時多個用戶進程仍然可以共用這個檔,只要其不是在同一個時間內對這個檔進行操作。
    在進程中利用Open命令來打開檔是程式中對檔進行操作的前提。只有先利用Open命令打開檔,然後應用程式才能夠對檔進行操作,如加入內容、刪除內容、更新資訊等等。故在應用程式編寫中,需要以合適的方式、合適的許可權來打開相關的檔。若有多個進程需要訪問同一個檔,則最好採用鎖機制來保障各個進程能夠和諧共用這個檔。
arrow
arrow
    全站熱搜

    lalalah 發表在 痞客邦 留言(0) 人氣()