軟件開發(fā)——用C與腳本的混合編程來處理配置文件.doc_第1頁
軟件開發(fā)——用C與腳本的混合編程來處理配置文件.doc_第2頁
軟件開發(fā)——用C與腳本的混合編程來處理配置文件.doc_第3頁
軟件開發(fā)——用C與腳本的混合編程來處理配置文件.doc_第4頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

軟件開發(fā)用C與腳本的混合編程來處理配置文件摘自上海青慧/Html/jishu/linux/2932.html在linux上寫程序、做網(wǎng)管的人,或多或少都會幾種腳本。腳本語言靈活的變量類型、強大的正則表達式處理能力,再加上linux系統(tǒng)本身的管道、重定向以及豐富的命令行工具,讓你編程起來游刃有余。而C語言固然有種種優(yōu)勢,但不可否認,很多場合下,用腳本語言更為方便,比如我們將舉例說明的對配置文件的處理。先看看我們示例程序的任務(wù):假設(shè)我們有一個用c寫的程序,它有一個配置文件 user.conf,保存了一些用戶信息,user.conf定義如下:1)、以 # 開頭的行為注釋行,不做處理。2)、允許空行。3)、如果不是1和2,那么就是有效的數(shù)據(jù),格式如下# user.conf: configure file for user# username age * countrytom 20 male uschen 22 female cn每一列分為4個字段,字段之間用一個或多個空白字符(空格或者制表符)隔開,字段依次是 姓名、年齡、性別、國家。我們的c程序要完成對 user.conf的添加、刪除、編輯、查詢。這樣一個簡單的任務(wù),用c處理起來不算復雜,不過也是要花點功夫的,而如果用腳本語言來做,卻很簡單,能不能在c中調(diào)用腳本來完成任務(wù)了?Awk是linux上一種腳本語言,它的長處在于處理有一定格式規(guī)則的文件,例如咱們的user.conf。關(guān)于 awk 的資料有很多,oreilly公司出了專門的 awk 編程的書籍,網(wǎng)上也是可以下載到的。你也可以直接 man awk看看。我們先看看如何用 shell 結(jié)合 awk來完成上述任務(wù):1) 添加一條記錄例如,要添加 jack 18 male us 這樣一條記錄,可以簡單的用重定向功能Echo e “jack 18 male us” user.conf現(xiàn)在,這條記錄被添加到 user.conf末尾了。2) 刪除一條記錄例如,現(xiàn)在要刪除用戶 chen 的信息cat user.conf | awk !/chen:blank:+/ print tmp.conf; mv f tmp.conf user.conf3)、編輯一條記錄現(xiàn)在,想把 tom的性別改為 femalecat user.conf | awk if($0 /tom:blank:+/) print $1 $2 female $3; else print通過 system()這個函數(shù),我們就可以在 c 中調(diào)用以上腳本,完成任務(wù)了。但是,system() 用起來還是覺得不爽,它的不足是只能執(zhí)行腳本,卻無法獲得腳本的輸出數(shù)據(jù),而這通常是我們進一步處理的數(shù)據(jù)來源。(在shell和perl中,可以通過反引號( )來取得命令的輸出結(jié)果)。 一個解決辦法是把輸出結(jié)果重定向到一個臨時文件中,然后在c中讀取文件,獲取數(shù)據(jù),最后當然還要刪除這個文件。不過,這個方法總是讓人覺得有一點點不爽,如果能直接把腳本執(zhí)行中輸出的數(shù)據(jù)輸?shù)轿覀兊木彌_區(qū)來就更好了。我寫了個小函數(shù),叫 my_system(),通過管道以及重定向,實現(xiàn)了以上想法。函數(shù)原型如下:int my_system(const char* pCmd, char* pResult, int size);輸出數(shù)據(jù)被保存到 pResult所指向的緩沖區(qū)中,緩沖區(qū)大小為 size,最多可以保存 size-1的數(shù)據(jù)。函數(shù)的實現(xiàn)放在本文的最后。有了這個函數(shù)以后,在 c中調(diào)用腳本就更方便了,我們可以通過它來實現(xiàn)對 user.conf的查詢。4)、查詢一個記錄例如,我們要獲取 tom 的性別可以用腳本這樣來實現(xiàn):cat user.conf | awk /tom:blank:+/ print $3腳本的執(zhí)行結(jié)果是 tom的性別 male被輸出到屏幕上。在我們的 c程序中,如此調(diào)用my_system(),char buf101;my_system(“cat user.conf | awk /tom:blank:+/ print $3”, buf, 101);調(diào)用完以后,buf中的數(shù)據(jù)就是 “male”了,怎么樣,還算方便吧?以上只是用結(jié)合腳本完成了一個比較簡單的任務(wù),所以我沒有把這些腳本單獨形成腳本文件。如果你善于使用 perl、shell、awk,那么可以寫出更強大的腳本文件來處理更復雜的問題,然后通過類似 my_system( )的方法,在 c/c+等其它語言中取得腳本的輸出結(jié)果,實現(xiàn)有趣的“混合編程”。希望你能從中得到樂趣!#include#include#include#include#includestatic int my_system(const char* pCmd, char* pResult, int size)int fd2;int pid;int count;int left;char* p = 0;int maxlen = size 1;memset(pResult, 0, size);if(pipe(fd)printf(pipe errorn);return 1;if(pid = fork() = 0)/ chile processint fd22;if(pipe(fd2)printf(pipe2 errorn);return 1;close(1);dup2(fd21,1);close(fd0);close(fd21);system(pCmd);read(fd20, pResult, maxlen);pResultstrlen(pResult)-1 = 0;write(fd1, pResult, strlen(pResult);close(fd20);exit(0);/ parent processclose(fd1);p = pResult;left = maxlen;while(count = read(fd0, p, left) p += count;left -= count;if(left = 0)break;c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論