文章試讀
不拘一個遍程序系列:編程序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四
職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟件人才 精力充沛與事業成功 讓系分來得更猛烈些吧 不值錢的系統分析師 經濟危機下大學生如何就業
我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌 香格裡拉美人圖
寶寶圖片:超可愛的小寶寶 寫博客
考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析 2008年12月程序員試題分析 2009年軟考備考全攻略 2008年5月程序員試題解析 輕松寫系分論文
精通Unix下C語言編程與項目實踐之
第19章 分布式應用技術之遠程調用模型
作者:朱雲翔,胡平
在網絡時代的生產實踐中,提供服務往往是分布式地,而單個主機系統,也經常需要調用其它主機系統的服務。比如出於安全性考慮,某些數據庫系統常常被限制為只能在某台幾台)主機上直接訪問,這樣就只有部分主機暫時稱之為數據庫主機)能夠訪問和操作數據庫。其它主機暫時稱之為遠程主機)就必須調用數據庫主機提供的服務才能完成數據庫操作,這個遠程調用的流程一般為:向數據庫主機建立套接字連接,並發送訪問申請。數據庫主機接收這些申請,並校驗遠程主機的合法性,再向數據庫轉發操作請求,最後把數據庫操作結果返回給遠程主機。整個過程對於用戶來說是透明的,就好像遠程主機直接訪問了數據庫一樣。
遠程調用就是指本地主機運行網絡中另外一台計算機上某程序、函數或服務,就如同在本機上運行一樣,以上關於數據庫的訪問就是遠程調用的一個例子。遠程調用也使用了客戶機-服務器模型,發送本地請求的主機是客戶機,網絡中另外一台實際運行進程或服務的主機就是服務器。
本章將設計一個遠程調用的模型,在服務器端運行一個進程,這個進程接收客戶端發送的shell請求,通過安全性驗證後在服務器端運行這個shell,並將輸出結果轉發到客戶端。
19.1 系統分析
本項目實際上是運行在服務器端的一個程序,它接收客戶申請、執行shell命令、將shell輸出結果轉發到客戶端,那麼在設計項目前必須解決如下問題:
1. 接收客戶端請求
服務器端如何接收並處理客戶申請,包括采用什麼樣的通信發送,選擇並發處理流程還是串行處理流程等。
2. 執行shell命令
服務器端如何運行客戶請求的shell命令,選擇何種方式在進程中執行其它的程序,供選擇的答案有system、fork-exec和popen。
3. 獲取運行的shell輸出結果
由於服務器需要把進程運行時的輸出結果返回給客戶端,那麼就必須考慮如何獲取正在運行的shell進程的輸出結果。
事實上新進程的執行可以選擇以下兩種方案:
(1) system或fork-exec
在此方案下,服務進程無法交互式的獲取shell進程的輸出信息,但可以通過輸入輸出重定向,將shell進程的輸出寫入到一個文件中,待shell進程執行完畢後讀取該文件,並將其內容發送給客戶端即可。
(2) popen
以管道的方式創建新進程執行shell命令,設置函數popen的參數type為“r”,就可以及時獲取shell進程的輸出信息了。
例1. 以popen執行命令szCmd,並將命令szCmd的輸出結果打印到stderr中。
FILE *pfile;
char szLine[8192 + 1];
pfile = popen(szCmd, "r"); /* 創建管道、執行shell命令 */
while (fgets(szLine, sizeof(szLine), pfile) != NULL) /* 讀取輸出結果 */
{
PrintLog(stderr, szLine); /* 打印輸出結果 */
}
pclose(pfile); /* 結束shell進程,關閉管道 */
與采用system或fork-exec方式相比,采用popen方式執行shell命令不但設計簡單,而且可以直接、及時地讀取到命令的輸出結果。因此,本項目以多進程並發套接字模式接收客戶端的請求,並采用popen交互地執行新進程。
相關文章:
封面 前言 目錄 策劃 作者
動態庫 變長參數 文件鎖 外設 僵死進程
定時器 I/O重定向 消息隊列 共享內存
實踐項目:
開發網頁投票器一) 二)
開發網頁投票器 字符串報文
銀行代發工資報文
Unix下遠程控制程序
本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/142510