锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区免费视频,蜜臀在线观看,福利在线免费视频http://www.aygfsteel.com/shiliqiang/articles/290421.html鐭沖ご@鐭沖ご@Sun, 09 Aug 2009 03:09:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/290421.htmlhttp://www.aygfsteel.com/shiliqiang/comments/290421.htmlhttp://www.aygfsteel.com/shiliqiang/articles/290421.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/290421.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/290421.html涓€錛庡熀鏈蹇?br /> 闆? 鎷瘋礉錛坺ero-copy錛夊熀鏈€濇兂鏄細鏁版嵁鎶ヤ粠緗戠粶璁懼鍒扮敤鎴風▼搴忕┖闂翠紶閫掔殑榪囩▼涓紝鍑忓皯鏁版嵁鎷瘋礉嬈℃暟錛屽噺灝戠郴緇熻皟鐢紝瀹炵幇CPU鐨勯浂鍙備笌錛屽交搴曟秷闄? CPU鍦ㄨ繖鏂歸潰鐨勮礋杞姐€傚疄鐜伴浂鎷瘋礉鐢ㄥ埌鐨勬渶涓昏鎶€鏈槸DMA鏁版嵁浼犺緭鎶€鏈拰鍐呭瓨鍖哄煙鏄犲皠鎶€鏈€傚鍥?鎵€紺猴紝浼犵粺鐨勭綉緇滄暟鎹姤澶勭悊錛岄渶瑕佺粡榪囩綉緇滆澶囧埌鎿嶄綔 緋葷粺鍐呭瓨絀洪棿錛岀郴緇熷唴瀛樼┖闂村埌鐢ㄦ埛搴旂敤紼嬪簭絀洪棿榪欎袱嬈℃嫹璐濓紝鍚屾椂榪橀渶瑕佺粡鍘嗙敤鎴峰悜緋葷粺鍙戝嚭鐨勭郴緇熻皟鐢ㄣ€傝€岄浂鎷瘋礉鎶€鏈垯棣栧厛鍒╃敤DMA鎶€鏈皢緗戠粶鏁版嵁鎶ョ洿鎺? 浼犻€掑埌緋葷粺鍐呮牳棰勫厛鍒嗛厤鐨勫湴鍧€絀洪棿涓紝閬垮厤CPU鐨勫弬涓庯紱鍚屾椂錛屽皢緋葷粺鍐呮牳涓瓨鍌ㄦ暟鎹姤鐨勫唴瀛樺尯鍩熸槧灝勫埌媯€嫻嬬▼搴忕殑搴旂敤紼嬪簭絀洪棿錛堣繕鏈変竴縐嶆柟寮忔槸鍦ㄧ敤鎴風┖ 闂村緩绔嬩竴緙撳瓨錛屽茍灝嗗叾鏄犲皠鍒板唴鏍哥┖闂達紝綾諱技浜巐inux緋葷粺涓嬬殑kiobuf鎶€鏈級錛屾嫻嬬▼搴忕洿鎺ュ榪欏潡鍐呭瓨榪涜璁塊棶錛屼粠鑰屽噺灝戜簡緋葷粺鍐呮牳鍚戠敤鎴風┖闂寸殑鍐? 瀛樻嫹璐濓紝鍚屾椂鍑忓皯浜嗙郴緇熻皟鐢ㄧ殑寮€閿€錛屽疄鐜頒簡鐪熸鐨?#8220;闆舵嫹璐?#8221;銆?br />

鍥? 浼犵粺鏁版嵁澶勭悊涓庨浂鎷瘋礉鎶€鏈箣姣旇緝
浜岋紟瀹炵幇
鍦╮edhat7.3 涓婇€氳繃淇敼鍏跺唴鏍告簮鐮佷腑闄勫甫鐨?139too.c瀹屾垚闆舵嫹璐濈殑璇曢獙錛屼富瑕佹兂娉曟槸錛氬湪8139too緗戝崱椹卞姩妯″潡鍚姩鏃剁敵璇蜂竴鍐呮牳緙撳瓨錛屽茍寤虹珛涓€鏁版嵁緇撴瀯瀵? 鍏惰繘琛岀鐞嗭紝鐒跺悗璇曢獙鎬х殑鍚戣緙撳瓨鍐欏叆澶氫釜瀛楃涓叉暟鎹紝鏈€鍚庨€氳繃proc鏂囦歡緋葷粺灝嗚緙撳瓨鐨勫湴鍧€浼犵粰鐢ㄦ埛榪涚▼錛涚敤鎴瘋繘紼嬮€氳繃璇籶roc鏂囦歡緋葷粺鍙栧緱緙撳瓨鍦? 鍧€騫跺璇ョ紦瀛樿繘琛屽湴鍧€鏄犲皠錛屼粠鑰屽彲浠ヤ粠鍏朵腑璇誨彇鏁版嵁銆傚搱鍝堬紝涓轟簡鍋鋒噿錛屾湰鏂囧彧鏄闆舵嫹璐濇€濇兂涓殑鍦板潃鏄犲皠閮ㄥ垎榪涜璇曢獙錛岃€屾病鏈夊疄鐜癉MA鏁版嵁浼犺緭錛堝お楹葷儲 浜嗭紝榪樺緱浜嗚В紜歡錛夛紝鏈瘯楠屽茍涓嶆槸涓€涓狪DS浜у搧涓姄鍖呮ā鍧楃殑涓€閮ㄥ垎錛岃鎯崇湡姝e湪IDS涓疄鐜伴浂鎷瘋礉錛岄櫎浜咲MA澶栵紝榪樻湁涓€浜涢棶棰橀渶鑰冭檻錛岃瑙佹湰鏂囩涓夎妭 鐨勫垎鏋愩€備互涓嬩負瀹炵幇闆舵嫹璐濈殑涓昏姝ラ錛岃緇嗕唬鐮佽闄勫綍銆?br />
姝ラ涓€錛氫慨鏀圭綉鍗¢┍鍔ㄧ▼搴?/font>
a錛庡湪緗戝崱椹卞姩紼嬪簭涓敵璇蜂竴鍧楃紦瀛?/font>錛氱敱浜庡湪linux2.4.X鍐呮牳涓敮鎸佺殑鏈€澶у彲鍒嗛厤榪炵畫緙撳瓨澶у皬涓?M錛屾墍浠ュ鏋滈渶瑕佸瓨鍌ㄦ洿澶ч噺鐨勭綉緇滄暟鎹姤鏂囷紝鍒欓渶瑕佸垎閰嶅鍧楅潪榪炵畫鐨勭紦瀛橈紝騫朵嬌鐢ㄩ摼琛ㄣ€佹暟緇勬垨hash琛ㄦ潵瀵硅繖浜涚紦瀛樿繘琛岀鐞嗐€?br />
#define PAGES_ORDER 9
unsigned long su1_2
su1_2 = __get_free_pages(GFP_KERNEL,PAGES_ORDER);

b. 鍚戠紦瀛樹腑鍐欏叆鏁版嵁錛氱湡姝DS浜у搧涓殑闆舵嫹璐濆疄鐜板簲璇ユ槸浣跨敤DMA鏁版嵁浼犺緭鎶婄綉鍗$‖ 浠舵帴鏀跺埌鐨勫寘鐩存帴鍐欏叆璇ョ紦瀛樸€備綔涓鴻瘯楠岋紝鎴戝彧鏄悜璇ョ紦瀛樹腑鍐欏叆鍑犱釜浠繪剰 鐨勫瓧絎︿覆錛屽鏋滀笉鑰冭檻DMA鑰屽張鎯沖悜緙撳瓨涓啓鍏ョ湡姝g殑緗戠粶鏁版嵁鍖咃紝鍙互鍦?139too.c鐨剅tl8139_rx_interrupt()涓皟鐢? netif_rx()鍚庢彃鍏ヤ互涓嬩唬鐮侊細

//put_pkt2mem_n++; //鍖呬釜鏁?br /> //put_mem(skb->data,pkt_size);
鍏朵腑put_pkt2mem_n鍙橀噺鍜宲ut_mem鍑芥暟瑙侀檮褰曘€?br />
c. 鎶婅緙撳瓨鐨勭墿鐞嗗湴鍧€浼犲埌鐢ㄦ埛絀洪棿錛氱敱浜庡湪鍐呮牳涓敵璇風殑緙撳瓨鍦板潃涓鴻櫄鎷熷湴鍧€錛岃€屽湪鐢ㄦ埛 絀洪棿闇€瑕佸緱鍒扮殑鏄緙撳瓨鐨勭墿鐞嗗湴鍧€錛屾墍浠ラ鍏堣榪涜铏氭嫙鍦板潃鍒扮墿鐞嗗湴鍧€ 鐨勮漿鎹紝鍦╨inux緋葷粺涓彲浠ヤ嬌鐢ㄥ唴鏍歌櫄鎷熷湴鍧€鍑?G鏉ヨ幏寰楀搴旂殑鐗╃悊鍦板潃銆傛妸緙撳瓨鐨勫湴鍧€浼犲埌鐢ㄦ埛絀洪棿闇€瑕佸湪鍐呮牳涓庣敤鎴風┖闂磋繘琛屽皯閲忔暟鎹紶杈擄紝榪欏彲浠ヤ嬌 鐢ㄥ瓧絎﹂┍鍔ㄣ€乸roc鏂囦歡緋葷粺絳夋柟寮忓疄鐜幫紝鍦ㄨ繖閲岄噰鐢ㄤ簡proc鏂囦歡緋葷粺鏂瑰紡銆?br />
int read_procaddr(char *buf,char **start,off_t offset,int count,int *eof,void *data)
{
     sprintf(buf,"%u\n",__pa(su1_2));
     *eof = 1;
     return 9;
}
create_proc_read_entry("nf_addr",0,NULL,read_procaddr,NULL);

姝ラ浜岋細鍦ㄧ敤鎴風▼搴忎腑瀹炵幇瀵瑰叡浜紦瀛樼殑璁塊棶
a.璇誨彇緙撳瓨鍦板潃錛氶€氳繃鐩存帴璇誨彇proc鏂囦歡鐨勬柟寮忎究鍙幏寰椼€?br />
char addr[9];
int fd_procaddr;
unsigned long ADDR;
fd_procaddr = open("/proc/nf_addr",O_RDONLY);
read(fd_procaddr,addr,9);
ADDR = atol(addr);

b.鎶婄紦瀛樻槧灝勫埌鐢ㄦ埛榪涚▼絀洪棿涓?/font>錛氬湪鐢ㄦ埛榪涚▼涓墦寮€/dev/mem璁懼(鐩稿綋浜庣墿鐞嗗唴瀛橈級錛屼嬌鐢╩map鎶婄綉鍗¢┍鍔ㄧ▼搴忕敵璇風殑緙撳瓨鏄犲皠鍒拌嚜宸辯殑榪涚▼絀洪棿錛岀劧鍚庡氨鍙互浠庝腑璇誨彇鎵€闇€瑕佺殑緗戠粶鏁版嵁鍖呬簡銆?br />
char *su1_2;
int fd;
fd=open("/dev/mem",O_RDWR);    
su1_2 = mmap(0,PAGES*4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ADDR);

涓夛紟鍒嗘瀽
     闆舵嫹璐濅腑瀛樺湪鐨勬渶鍏抽敭闂鏄悓姝ラ棶棰橈紝涓€杈規槸澶勪簬鍐呮牳絀洪棿鐨勭綉鍗¢┍鍔ㄥ悜緙撳瓨涓啓鍏ョ綉緇滄暟鎹寘錛屼竴杈規槸鐢ㄦ埛榪涚▼鐩存帴瀵圭紦瀛樹腑鐨勬暟鎹寘榪涜鍒嗘瀽錛堟敞鎰忥紝涓嶆槸鎷? 璐濆悗鍐嶅垎鏋愶級錛岀敱浜庝袱鑰呭浜庝笉鍚岀殑絀洪棿錛岃繖浣垮緱鍚屾闂鍙樺緱鏇村姞澶嶆潅銆傜紦瀛樿鍒嗘垚澶氫釜灝忓潡錛屾瘡涓€鍧楀瓨鍌ㄤ竴涓綉緇滄暟鎹寘騫剁敤涓€鏁版嵁緇撴瀯琛ㄧず錛屾湰璇曢獙鍦ㄥ寘鏁版嵁 緇撴瀯涓嬌鐢ㄦ爣蹇椾綅鏉ユ爣璇嗕粈涔堟椂鍊欏彲浠ヨ繘琛岃鎴栧啓錛?font color="#0000ff">褰撶綉鍗¢┍鍔ㄥ悜鍖呮暟鎹粨鏋勪腑濉叆鐪熷疄鐨勫寘鏁版嵁鍚庝究鏍囪瘑璇ュ寘涓哄彲璇伙紝褰撶敤鎴瘋繘紼嬪鍖呮暟鎹粨鏋勪腑鐨勬暟鎹垎鏋愬畬鍚?渚挎爣璇嗚鍖呬負鍙啓錛岃繖鍩烘湰瑙e喅浜嗗悓姝ラ棶棰?/font>銆傜劧鑰岋紝鐢變簬IDS鐨勫垎鏋愯繘紼嬮渶瑕佺洿鎺ュ緙撳瓨涓殑鏁版嵁榪涜鍏ヤ鏡鍒嗘瀽錛岃€屼笉鏄皢鏁版嵁鎷瘋礉鍒扮敤鎴風┖闂村悗鍐嶈繘琛屽垎鏋愶紝榪?浣垮緱璇繪搷浣滆鎱簬鍐欐搷浣滐紝鏈夊彲鑳介€犳垚緗戝崱椹卞姩鏃犵紦瀛樼┖闂村彲浠ュ啓錛屼粠鑰岄€犳垚涓€瀹氱殑涓㈠寘鐜拌薄錛岃В鍐寵繖涓€闂鐨勫叧閿湪浜?font color="#0000ff">鐢寵澶氬ぇ鐨勭紦瀛?/font>錛屽お灝忕殑緙撳瓨瀹規槗閫犳垚涓?鍖咃紝澶ぇ鐨勭紦瀛樺垯綆$悊楹葷儲騫朵笖瀵圭郴緇熸€ц兘浼氭湁姣旇緝澶х殑褰卞搷銆?br />
鍥涳紟闄勫綍
a.     8139too.c涓姞鍏ョ殑浠g爜

/*add_by_liangjian for zero_copy*/
#include <linux/wrapper.h>
#include <asm/page.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
#define PAGES_ORDER 9
#define PAGES 512
#define MEM_WIDTH     1500
/*added*/

/*add_by_liangjian for zero_copy*/
struct MEM_DATA
{
     //int key;
     unsigned short width;/*緙撳啿鍖哄搴?/
     unsigned short length;/*緙撳啿鍖洪暱搴?/
     //unsigned short wtimes;/*鍐欒繘紼嬭鏁?棰勭暀錛屼負浠ュ悗鍙互澶氫釜榪涚▼鍐?/
     //unsigned short rtimes;/*璇昏繘紼嬭鏁?棰勭暀錛屼負浠ュ悗鍙互澶氫釜榪涚▼璇?/
     unsigned short wi;/*鍐欐寚閽?/
     unsigned short ri;/*璇繪寚閽?/
} * mem_data;
struct MEM_PACKET
{
     unsigned int len;
     unsigned char packetp[MEM_WIDTH - 4];/*sizeof(unsigned int) == 4*/
};
unsigned long su1_2;/*緙撳瓨鍦板潃*/
/*added*/

/*add_by_liangjian for zero_copy*/
//鍒犻櫎緙撳瓨
void del_mem()
{
     int pages = 0;
     char *addr;
     addr = (char *)su1_2;
     while (pages <=PAGES -1)
     {
         mem_map_unreserve(virt_to_page(addr));
         addr = addr + PAGE_SIZE;
         pages++;
     }
     free_pages(su1_2,PAGES_ORDER);    
}    
void init_mem()
/********************************************************
*                   鍒濆鍖栫紦瀛?br /> *       杈撳叆:   aMode:     緙撳啿鍖鴻鍐欐ā寮?   r,w         *
*       榪斿洖:   00:     澶辮觸                         *
*               >0:     緙撳啿鍖哄湴鍧€                   *
********************************************************/
{
     int i;
     int pages = 0;
     char *addr;
     char *buf;
     struct MEM_PACKET * curr_pack;
    
     su1_2 = __get_free_pages(GFP_KERNEL,PAGES_ORDER);
     printk("[%x]\n",su1_2);
     addr = (char *)su1_2;
     while (pages <= PAGES -1)
     {
         mem_map_reserve(virt_to_page(addr));//闇€浣跨紦瀛樼殑欏甸潰甯擱┗鍐呭瓨
         addr = addr + PAGE_SIZE;
         pages++;
     }
     mem_data = (struct MEM_DATA *)su1_2;
     mem_data[0].ri = 1;
           mem_data[0].wi = 1;
           mem_data[0].length = PAGES*4*1024 / MEM_WIDTH;
           mem_data[0].width = MEM_WIDTH;
     /* initial su1_2 */
     for(i=1;i<=mem_data[0].length;i++)
     {
         buf = (void *)((char *)su1_2 + MEM_WIDTH * i);
         curr_pack = (struct MEM_PACKET *)buf;
         curr_pack->len = 0;
     }    
}
int put_mem(char *aBuf,unsigned int pack_size)
/****************************************************************
*                 鍐欑紦鍐插尯瀛愮▼搴?nbsp;                                *
*       杈撳叆鍙傛暟     :   aMem:   緙撳啿鍖哄湴鍧€                       *
*                       aBuf:   鍐欐暟鎹湴鍧€                       *
*       杈撳嚭鍙傛暟     :   <=00 :   閿欒                             *
*                       XXXX :   鏁版嵁欏瑰簭鍙?nbsp;                      *
*****************************************************************/
{
     register int s,i,width,length,mem_i;
     char *buf;
     struct MEM_PACKET * curr_pack;

     s = 0;
     mem_data = (struct MEM_DATA *)su1_2;
     width   = mem_data[0].width;
     length = mem_data[0].length;
     mem_i   = mem_data[0].wi;
     buf = (void *)((char *)su1_2 + width * mem_i);

     for (i=1;i<length;i++){
         curr_pack = (struct MEM_PACKET *)buf;
             if   (curr_pack->len == 0){
                     memcpy(curr_pack->packetp,aBuf,pack_size);
                     curr_pack->len = pack_size;;
                 s = mem_i;
             mem_i++;
                     if   (mem_i >= length)
                         mem_i = 1;
                 mem_data[0].wi = mem_i;
                 break;
             }
             mem_i++;
             if   (mem_i >= length){
                     mem_i = 1;
                     buf = (void *)((char *)su1_2 + width);
             }
             else buf = (char *)su1_2 + width*mem_i;
         }

     if(i >= length)
             s = 0;
     return s;
}
// proc鏂囦歡璇誨嚱鏁?br /> int read_procaddr(char *buf,char **start,off_t offset,int count,int *eof,void *data)
{
     sprintf(buf,"%u\n",__pa(su1_2));
     *eof = 1;
     return 9;
}
/*added*/

鍦?139too.c鐨剅tl8139_init_module()鍑芥暟涓姞鍏ヤ互涓嬩唬鐮侊細
/*add_by_liangjian for zero_copy*/
     put_pkt2mem_n = 0;
     init_mem();
     put_mem("data1dfadfaserty",16);
     put_mem("data2zcvbnm",11);
     put_mem("data39876543210poiuyt",21);
     create_proc_read_entry("nf_addr",0,NULL,read_procaddr,NULL);
/*added */    

鍦?139too.c鐨剅tl8139_cleanup_module()鍑芥暟涓姞鍏ヤ互涓嬩唬鐮侊細
/*add_by_liangjian for zero_copy*/
     del_mem();
     remove_proc_entry("nf_addr",NULL);
/*added*/    

b錛庣敤鎴風┖闂磋鍙栫紦瀛樹唬鐮?/font>

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#define PAGES 512
#define MEM_WIDTH 1500
struct MEM_DATA
{
     //int key;
     unsigned short width;/*緙撳啿鍖哄搴?/
     unsigned short length;/*緙撳啿鍖洪暱搴?/
     //unsigned short wtimes;/*鍐欒繘紼嬭鏁?棰勭暀錛屼負浠ュ悗鍙互澶氫釜榪涚▼鍐?/
     //unsigned short rtimes;/*璇昏繘紼嬭鏁?棰勭暀錛屼負浠ュ悗鍙互澶氫釜榪涚▼璇?/
     unsigned short wi;/*鍐欐寚閽?/
     unsigned short ri;/*璇繪寚閽?/
} * mem_data;

struct MEM_PACKET
{
     unsigned int len;
     unsigned char packetp[MEM_WIDTH - 4];/*sizeof(unsigned int) == 4*/
};

int get_mem(char *aMem,char *aBuf,unsigned int *size)
/****************************************************************
*                 璇葷紦鍐插尯瀛愮▼搴?nbsp;                                *
*       杈撳叆鍙傛暟     :   aMem:   緙撳啿鍖哄湴鍧€                       *
*                       aBuf:   榪斿洖鏁版嵁鍦板潃, 鍏舵暟鎹尯闀垮害搴斿ぇ浜?
*                               緙撳啿鍖哄搴?nbsp;                      *
*       杈撳嚭鍙傛暟     :   <=00 :   閿欒                             *
*                       XXXX :   鏁版嵁欏瑰簭鍙?nbsp;                      *
*****************************************************************/
{
     register int i,s,width,length,mem_i;
     char     *buf;
     struct MEM_PACKET * curr_pack;

     s = 0;
     mem_data = (void *)aMem;
     width   = mem_data[0].width;
     length = mem_data[0].length;
     mem_i   = mem_data[0].ri;
     buf = (void *)(aMem + width * mem_i);

     curr_pack = (struct MEM_PACKET *)buf;
     if   (curr_pack->len != 0){/*絎竴涓瓧鑺備負0璇存槑璇ラ儴鍒嗕負絀?/
             memcpy(aBuf,curr_pack->packetp,curr_pack->len);
             *size = curr_pack->len;
             curr_pack->len = 0;
             s = mem_data[0].ri;
             mem_data[0].ri++;
             if(mem_data[0].ri >= length)
                     mem_data[0].ri = 1;
             goto ret;
         }
    
     for (i=1;i<length;i++){
             mem_i++;/*緇х畫鍚戝悗鎵撅紝鏈€緋熺硶鐨勬儏鍐墊槸鎶婃暣涓紦鍐插尯閮芥壘涓€閬?/
             if   (mem_i >= length)
                 mem_i = 1;
             buf = (void *)(aMem + width*mem_i);
             curr_pack = (struct MEM_PACKET *)buf;
             if   (curr_pack->len == 0)
                     continue;
             memcpy(aBuf,curr_pack->packetp,curr_pack->len);
             *size = curr_pack->len;
             curr_pack->len = 0;
             s = mem_data[0].ri = mem_i;
             mem_data[0].ri++;
             if(mem_data[0].ri >= length)
             mem_data[0].ri = 1;
             break;
         }

     ret:
     return s;
}

int main()
{
     char *su1_2;
     char receive[1500];
     int i,j;
     int fd;
     int fd_procaddr;
     unsigned int size;
     char addr[9];
     unsigned long ADDR;
    
     j = 0;
     /*open device 'mem' as a media to access the RAM*/
     fd=open("/dev/mem",O_RDWR);    
     fd_procaddr = open("/proc/nf_addr",O_RDONLY);
     read(fd_procaddr,addr,9);
     ADDR = atol(addr);
     close(fd_procaddr);
     printf("%u[%8lx]\n",ADDR,ADDR);
     /*Map the address in kernel to user space, use mmap function*/
     su1_2 = mmap(0,PAGES*4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ADDR);
     perror("mmap");
     while(1)
     {
         bzero(receive,1500);
         i = get_mem(su1_2,receive,&size);
         if (i != 0)
         {
             j++;
             printf("%d:%s[size = %d]\n",j,receive,size);
         }    
         else
         {
             printf("there have no data\n");
             munmap(su1_2,PAGES*4*1024);
             close(fd);
             break;
         }
     }
     while(1);
}

浜旓紟鍙傝€冩枃鐚?br /> 1錛嶤HRISTIAN KURMANN, FELIX RAUCH ,THOMAS M. STRICKER.
Speculative Defragmentation - Leading Gigabit Ethernet to True Zero-Copy Communication
2錛嶢LESSANDRO RUBINI,JONATHAN CORBET.銆奓INUX DEVICE DRIVERS 2銆?O’Reilly & Associates 2002.
3錛庤儭甯屾槑,姣涘痙鎿?銆奓INUX 鍐呮牳婧愪唬鐮佹儏鏅垎鏋愩€?嫻欐睙澶у鍑虹増紺?2001


鍏? 浜庝綔鑰咃細姊佸仴錛屽崕鍖楄綆楁妧鏈爺絀舵墍鍦ㄨ紜曞+鐮旂┒鐢燂紝鐮旂┒鏂瑰悜錛氫俊鎭畨鍏ㄣ€傝鏂囧紑棰樹負銆婂熀浜庣郴緇熻皟鐢ㄥ垎鏋愮殑涓繪満寮傚父鍏ヤ鏡媯€嫻嬩笌闃插盡銆嬨€傚IDS鏈変袱騫村鐨勭爺 絀剁粡楠岋紝鐔熸倝linux鍐呮牳錛岀啛鎮塴inux c/c++緙栫▼銆亀in32 API緙栫▼錛屽緗戠粶鍜屾搷浣滅郴緇熷畨鍏ㄦ劅鍏磋叮銆?br /> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
闆舵嫹璐濇妧鏈垎涓轟袱姝ワ細
1銆佺‖浠跺埌鍐呮牳錛屽疄鐜扮殑鍓嶆彁鏄綉鍗″繀欏繪敮鎸丏MA錛屽浜庝笉鏀寔DMA鐨勭綉鍗℃棤娉曞疄鐜伴浂鎷瘋礉銆?
2銆佸唴鏍稿埌鐢ㄦ埛灞傦紝灝嗙郴緇熷唴鏍鎬腑瀛樺偍鏁版嵁鎶ョ殑鍐呭瓨鍖哄煙鏄犲皠鍒版嫻嬬▼搴忕殑搴旂敤紼嬪簭絀洪棿鎴栬€呭湪鐢ㄦ埛絀洪棿寤虹珛涓€緙撳瓨錛屽茍灝嗗叾鏄犲皠鍒板唴鏍哥┖闂淬€?
寰堝鐩稿叧鍏徃閮介噰鐢ㄤ簡榪欑鎶€鏈疐irewall/IDS絳夛紝榪欎袱縐嶆妧鏈凡緇忓緢鎴愮啛浜?br />
鎽樿嚜錛歨ttp://hi.baidu.com/msingle/blog/item/0ec4eb239db94e40ad34de18.html


]]>
紜洏 綈?/title><link>http://www.aygfsteel.com/shiliqiang/articles/290389.html</link><dc:creator>鐭沖ご@</dc:creator><author>鐭沖ご@</author><pubDate>Sat, 08 Aug 2009 14:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/shiliqiang/articles/290389.html</guid><wfw:comment>http://www.aygfsteel.com/shiliqiang/comments/290389.html</wfw:comment><comments>http://www.aygfsteel.com/shiliqiang/articles/290389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shiliqiang/comments/commentRss/290389.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shiliqiang/services/trackbacks/290389.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="tit"> </div> <div id="wmqeeuq" class="cnt"> <p>鏂? 浠剁郴緇熸槸鎿嶄綔緋葷粺涓庨┍鍔ㄥ櫒涔嬮棿鐨勬帴鍙o紝褰撴搷浣滅郴緇熻姹備粠紜洏閲岃鍙栦竴涓枃浠舵椂錛屼細璇鋒眰鐩稿簲鐨勬枃浠剁郴緇燂紙FAT 16/32/NTFS錛夋墦寮€鏂囦歡銆傛墖鍖烘槸紓佺洏鏈€灝忕殑鐗╃悊瀛樺偍鍗曞厓錛屼絾鐢變簬鎿嶄綔緋葷粺鏃犳硶瀵規暟鐩紬澶氱殑鎵囧尯榪涜瀵誨潃錛屾墍浠ユ搷浣滅郴緇熷氨灝嗙浉閭葷殑鎵囧尯緇勫悎鍦ㄤ竴璧鳳紝 褰㈡垚涓€涓皣錛岀劧鍚庡啀瀵圭皣榪涜綆$悊銆傛瘡涓皣鍙互鍖呮嫭2銆?銆?銆?6銆?2鎴?4涓墖鍖恒€傛樉鐒訛紝綈囨槸鎿嶄綔緋葷粺鎵€浣跨敤鐨勯€昏緫姒傚康錛岃€岄潪紓佺洏鐨勭墿鐞嗙壒鎬с€?<br /> <br /> 涓轟簡鏇村ソ鍦扮鐞嗙鐩樼┖闂村拰鏇撮珮鏁堝湴浠庣‖鐩樿鍙栨暟鎹紝鎿嶄綔緋葷粺瑙勫畾涓€涓皣涓彧鑳芥斁緗竴涓枃浠剁殑鍐呭錛屽洜姝ゆ枃浠舵墍鍗犵敤鐨勭┖闂達紝鍙兘鏄皣鐨勬暣鏁板€嶏紱鑰屽鏋滄枃浠跺疄 闄呭ぇ灝忓皬浜庝竴綈囷紝瀹冧篃瑕佸崰涓€綈囩殑絀洪棿銆傛墍浠ワ紝涓€鑸儏鍐典笅鏂囦歡鎵€鍗犵┖闂磋鐣ュぇ浜庢枃浠剁殑瀹為檯澶у皬錛屽彧鏈夊湪灝戞暟鎯呭喌涓嬶紝鍗蟲枃浠剁殑瀹為檯澶у皬鎭板ソ鏄皣鐨勬暣鏁板€嶆椂錛屾枃 浠剁殑瀹為檯澶у皬鎵嶄細涓庢墍鍗犵┖闂村畬鍏ㄤ竴鑷淬€?/p> <p>鏂? 浠剁郴緇熸槸鎿嶄綔緋葷粺涓庨┍鍔ㄥ櫒涔嬮棿鐨勬帴鍙o紝褰撴搷浣滅郴緇熻姹備粠紜洏閲岃鍙栦竴涓枃浠舵椂錛屼細璇鋒眰鐩稿簲鐨勬枃浠剁郴緇燂紙FAT 16/32/NTFS錛夋墦寮€鏂囦歡銆傛墖鍖烘槸紓佺洏鏈€灝忕殑鐗╃悊瀛樺偍鍗曞厓錛屼絾鐢變簬鎿嶄綔緋葷粺鏃犳硶瀵規暟鐩紬澶氱殑鎵囧尯榪涜瀵誨潃錛屾墍浠ユ搷浣滅郴緇熷氨灝嗙浉閭葷殑鎵囧尯緇勫悎鍦ㄤ竴璧鳳紝 褰㈡垚涓€涓皣錛岀劧鍚庡啀瀵圭皣榪涜綆$悊銆傛瘡涓皣鍙互鍖呮嫭2銆?銆?銆?6銆?2鎴?4涓墖鍖恒€傛樉鐒訛紝綈囨槸鎿嶄綔緋葷粺鎵€浣跨敤鐨勯€昏緫姒傚康錛岃€岄潪紓佺洏鐨勭墿鐞嗙壒鎬с€?<br /> <br /> 涓轟簡鏇村ソ鍦扮鐞嗙鐩樼┖闂村拰鏇撮珮鏁堝湴浠庣‖鐩樿鍙栨暟鎹紝鎿嶄綔緋葷粺瑙勫畾涓€涓皣涓彧鑳芥斁緗竴涓枃浠剁殑鍐呭錛屽洜姝ゆ枃浠舵墍鍗犵敤鐨勭┖闂達紝鍙兘鏄皣鐨勬暣鏁板€嶏紱鑰屽鏋滄枃浠跺疄 闄呭ぇ灝忓皬浜庝竴綈囷紝瀹冧篃瑕佸崰涓€綈囩殑絀洪棿銆傛墍浠ワ紝涓€鑸儏鍐典笅鏂囦歡鎵€鍗犵┖闂磋鐣ュぇ浜庢枃浠剁殑瀹為檯澶у皬錛屽彧鏈夊湪灝戞暟鎯呭喌涓嬶紝鍗蟲枃浠剁殑瀹為檯澶у皬鎭板ソ鏄皣鐨勬暣鏁板€嶆椂錛屾枃 浠剁殑瀹為檯澶у皬鎵嶄細涓庢墍鍗犵┖闂村畬鍏ㄤ竴鑷淬€?/p> <div id="wmqeeuq" class="f14">綈囨槸鎸囧彲鍒嗛厤鐨勭敤鏉ヤ繚瀛樻枃浠剁殑鏈€灝忕鐩樼┖闂達紝璁$畻鏈轟腑鎵€鏈夌殑淇℃伅閮戒繚瀛樺湪綈囦腑銆傜皣瓚婂皬錛屼繚瀛樹俊鎭殑鏁堢巼灝辮秺楂樸€傚湪FAT16鏂囦歡緋葷粺涓紝姣忎釜鍒嗗尯鏈€澶氭湁65525涓皣錛岀皣澶у皬榛樿鍊間負32KB錛涘湪FAT32鏂囦歡緋葷粺涓嬌鐢ㄧ殑綈囨瘮FAT16灝忥紝榛樿涓?KB銆?<br /> 閭d箞鍦∟TFS鏂囦歡緋葷粺涓鐩樼皣鐨勫ぇ灝忚涓哄灝戞墠鍚堥€傚憿?涓嬮潰鐪嬬湅澶у鐨勮璁猴細 <br /> <br /> 涓€銆佸湪NTFS鏂囦歡緋葷粺涓浣曡緗皣澶у皬 <br /> <br /> 榛樿鐨勬儏鍐典笅錛屽湪鏍煎紡鍖栫殑鏃跺€欏鏋滄病鏈夋寚瀹氱皣鐨勫ぇ灝忥紝閭d箞緋葷粺浼氭牴鎹垎鍖虹殑澶у皬閫夋嫨榛樿鐨勭皣鍊箋€傚叾瀹炲湪NTFS鏂囦歡緋葷粺涓牸寮忓寲鐨勬椂鍊欙紝鍙互鍦? “Format”鍛戒護鍚庨潰娣誨姞“/a:UnitSize ”鍙傛暟鏉ユ寚瀹氱皣鐨勫ぇ灝忥紝UnitSize琛ㄧず綈囧ぇ灝忕殑鍊鹼紝NTFS鏀寔512/1024/2048/4096/8192/16K/32K/64K銆傛瘮濡? “format d:/fs:NTFS /a:2048”錛岃〃紺哄皢D鐩樼敤NTFS鏂囦歡緋葷粺鏍煎紡鍖栵紝綈囩殑鍊間負2048B銆?<br /> <br /> 浜屻€佷嬌鐢ㄩ粯璁ょ殑璁劇疆 <br /> <br /> 瀵逛簬鍒濆鑰呮潵璇達紝鍏跺疄娌℃湁蹇呰鍘繪墜宸ヨ緗皣鐨勫ぇ灝忥紝鍥犱負涓€鑸儏鍐典笅浣跨敤榛樿鐨勮緗氨鍙互浜嗐€傛瘮濡傚湪鐢∟TFS鏂囦歡緋葷粺鏍煎紡鍖栧垎鍖虹殑鏃跺€欙紝緋葷粺浼氭牴鎹垎鍖虹殑澶у皬鑷姩閫夋嫨榛樿鐨勭皣澶у皬錛屾瘮濡?KB銆?<br /> <br /> 涓夈€佺皣鐨勫ぇ灝忓洜紜洏鍒嗗尯澶у皬鑰屽紓 <br /> <br /> 鍦∟TFS鏂囦歡緋葷粺涓紝褰撳垎鍖虹殑澶у皬鍦?GB浠ヤ笅鏃訛紝綈囩殑澶у皬搴旇姣旂浉搴旂殑FAT32綈囧皬錛屽嵆灝忎簬4KB錛涘綋鍒嗗尯鐨勫ぇ灝忓湪2GB浠ヤ笂鏃訛紙2GB~2TB錛夛紝綈囩殑澶у皬搴旇閮戒負4KB銆?<br /> <br /> 鍥涖€佷嬌鐢ㄥ帇緙╁姛鑳藉綈囧ぇ灝忕殑瑕佹眰 <br /> <br /> 鍦╓indows 2000/XP緋葷粺涓紝涓轟簡浣跨敤鍘嬬緝鍔熻兘鏉ヨ妭鐪佺鐩樼┖闂達紝蹇呴』閬靛驚涓や釜鏉′歡錛?<br /> <br /> 1錛庣鐩樺垎鍖哄繀欏繪槸NTFS鏂囦歡緋葷粺錛?<br /> 2錛庡垎鍖轟腑綈囩殑澶у皬涓嶅緱瓚呰繃4KB錛堥粯璁ょ皣鐨勫ぇ灝忥紝鍗?096瀛楄妭錛夈€?<br /> <br /> 浜斻€佺皣鐨勫ぇ灝忕殑褰卞搷 <br /> <br /> 鍦∟TFS鏂囦歡緋葷粺涓紝綈囩殑澶у皬浼氬獎鍝嶅埌紓佺洏鏂囦歡鐨勬帓鍒楋紝璁劇疆閫傚綋鐨勭皣澶у皬鍙互鍑忓皯紓佺洏絀洪棿涓㈠け鍜屽垎鍖轟笂紕庣墖鐨勬暟閲忋€傚鏋滅皣璁劇疆榪囧ぇ錛屼細褰卞搷鍒扮鐩樺瓨鍌ㄦ晥鐜囷紱鍙嶄箣濡傛灉璁劇疆榪囧皬錛岃櫧鐒朵細鎻愰珮鍒╃敤鏁堢巼錛屼絾鏄細浜х敓澶ч噺紓佺洏紕庣墖銆?/div> <div id="wmqeeuq" class="f14"> <div id="wmqeeuq" class="f14">紜? 鐩樻槸璁$畻鏈轟腑鏋佷負閲嶈鐨勫瓨鍌ㄨ澶囷紝璁$畻鏈哄伐浣滄墍鐢ㄥ埌鐨勫叏閮ㄦ枃浠剁郴緇熷拰鏁版嵁璧勬枡鐨勭粷澶у鏁伴兘瀛樺偍鍦ㄧ‖鐩樹腑銆傜‖鐩樻槸浜х敓璁$畻鏈鴻蔣鏁呴殰鏈€涓昏鐨勫湴鏂癸紝甯歌鐨勭‖鐩? 杞晠闅滄湁錛氱‖鐩橀噸瑕佸弬鏁板強鏂囦歡涓㈠け錛岀數鑴戜笉鑳借搗鍔紱紕庣墖榪囧錛岀數鑴戣繍琛岄€熷害鍙樻參錛涚‖鐩樺垎鍖哄悗涓㈠け瀹歸噺絳夈€傚浠樼‖鐩樿蔣鏁呴殰錛屽彧瑕佹垜浠偗鍔ㄨ剳騫跺埄鐢ㄤ竴浜涚‖鐩樼淮 鎶ゅ伐鍏鳳紝鍙戞尌涓€涓嶆€曡嫤銆佷簩涓嶆€曪紙紜洏錛夋鐨勯潻鍛界簿紲烇紝澶栧姞鑳嗗ぇ蹇冪粏錛屽綋鐒惰繕瑕佹帉鎻$‖鐩樺熀鏈父璇嗭紝榪欐牱灝卞彲浠ヨ交鏉炬悶瀹氾紙璇寸殑瀹規槗銆佸仛璧鋒潵鍙笉綆€鍗?:( 錛夈€傚洜姝わ紝鎴戞敹闆嗕簡澶ч噺鐨勮祫鏂欐暣鐞嗘眹緙栦簡“紜洏杞晠闅滃畬鍏ㄤ慨澶嶆墜鍐?#8221;錛屽笇鏈涜兘鍦ㄤ笌澶у涓€璧峰涔犵殑榪囩▼涓帉鎻$‖鐩樺父瑙佹晠闅滅殑鎺掗櫎鏂規硶錛屽仛鍒?#8220;鑷凡鍔ㄦ墜銆佷赴琛? 瓚抽”錛屽嚒浜嬩笉姹備漢鐨勭洰鐨勩€?<br /> 澶у鐭ラ亾錛屼竴涓‖鐩樿鑳藉瓨鏀炬枃浠訛紝蹇呴』緇忚繃紜洏鍒嗗尯錛屾牸寮忓寲絳夋搷浣滄楠わ紝鍥犱負緇忚繃榪欎簺姝ラ涔嬪悗錛屽湪紜洏涓氨寤虹珛璧蜂簡涓誨垎鍖猴紝寮曞鍒嗗尯錛岀‘瀹氫簡FAT16鎴? FAT32鏂囦歡琛ㄣ€備富鍒嗗尯鐨勪綔鐢ㄦ槸淇濆瓨紜洏涓悇閫昏緫鍒嗗尯鍦ㄧ洏鐗囦笂璧峰浣嶇疆鍜岀粓姝綅緗強鍒嗗尯鐨勫閲忓ぇ灝忋€傚紩瀵煎垎鍖虹殑浣滅敤鏄湪鍥哄畾鐨勪綅緗瓨鏀炬湁鎿嶄綔緋葷粺鏂囦歡錛? 鍦ㄧ數鑴戦€佺數鎴栧浣嶆椂錛岀敱BIOS紼嬪簭灝嗗浜庡浐瀹氫綅緗殑緋葷粺鏂囦歡瑁呭叆鍐呭瓨錛屽啀灝嗙數鑴戞帶鍒舵潈浜ょ粰緋葷粺鏂囦歡浜鴻€屽畬鎴愬紩瀵艱繃紼嬨€傛墿灞曞垎鍖轟綔涓轟竴涓富鍒嗗尯鍗犵敤浜嗕富鍒? 鍖鴻〃鐨勪竴涓〃欏廣€傚湪鎵╁睍鍒嗗尯璧峰浣嶇疆鎵€鎸囩ず鐨勬墖鍖猴紙鍗寵鍒嗗尯鐨勭涓€涓墖鍖猴級涓紝鍖呭惈鏈夌涓€涓€昏緫鍒嗗尯琛紝鍚屾牱浠?BEH瀛楄妭寮€濮嬶紝姣忎釜鍒嗗尯琛ㄩ」鍗犵敤16涓? 瀛楄妭銆傞€昏緫鍒嗗尯琛ㄤ竴鑸寘鍚袱涓垎鍖鴻〃欏癸紝涓€涓寚鍚戞煇閫昏緫鍒嗗尯錛屽彟涓€涓垯鎸囧悜涓嬩竴涓墿灞曞垎鍖恒€備笅涓€涓墿灞曞垎鍖虹殑棣栨墖鍖哄張鍖呭惈浜嗕竴涓€昏緫鍒嗗尯琛紝 <br /> 榪欐牱浠ユ綾繪帹錛屾墿灞曞垎鍖轟腑灝卞彲浠ュ寘鍚涓€昏緫鍒嗗尯銆備笅闈㈡垜浠氨鏉ュ涔犱竴涓嬬‖鐩樻暟鎹殑鍩烘湰緇撴瀯銆?<br /> 鈽?紜洏鐨勬暟鎹粨鏋?鈽?<br /> 鈶?MBR錛圡ain Boot Record 涓誨紩瀵艱褰曞尯錛?<br /> MBR浣嶄簬鏁翠釜紜洏鐨?紓侀亾0鏌遍潰1鎵囧尯錛屽寘鎷‖鐩樺紩瀵肩▼搴忓拰鍒嗗尯琛ㄣ€傚湪鎬誨叡512瀛楄妭鐨勭‖鐩樹富寮曞鎵囧尯涓紝MBR鍙崰鐢ㄤ簡鍏朵腑鐨?46涓瓧鑺傦紝鍏舵渶鍚庝袱 涓瓧鑺?#8220;55 AA”鏄垎鍖虹殑緇撴潫鏍囧織銆傚彟澶栫殑64涓瓧鑺備氦緇欎簡DPT錛圖isk Partition Table 紜洏鍒嗗尯琛級錛屼粠1BEH瀛楄妭寮€濮嬶紝鍏卞崰鐢?4涓瓧鑺傦紝鍖呭惈鍥涗釜鍒嗗尯琛ㄩ」銆傛瘡涓垎鍖鴻〃欏圭殑闀垮害涓?6涓瓧鑺傦紝瀹冨寘鍚竴涓垎鍖虹殑寮曞鏍囧織銆佺郴緇熸爣蹇椼€佽搗濮嬪拰 緇撳熬鐨勬煴闈㈠彿銆佹墖鍖哄彿銆佺澶村彿浠ュ強鏈垎鍖哄墠闈㈢殑鎵囧尯鏁板拰鏈垎鍖烘墍鍗犵敤鐨勬墖鍖烘暟銆傚叾涓?#8220;寮曞鏍囧織”琛ㄦ槑姝ゅ垎鍖烘槸鍚﹀彲寮曞錛屽嵆鏄惁媧誨姩鍒嗗尯銆傚綋寮曞鏍囧織涓? “80”鏃訛紝姝ゅ垎鍖轟負媧誨姩鍒嗗尯錛?#8220;緋葷粺鏍囧織”鍐沖畾浜嗚鍒嗗尯鐨勭被鍨嬶紝濡?#8220;06”涓篎AT16鍒嗗尯錛?#8220;0B”涓篎AT32鍒嗗尯錛?#8220;07”涓篘TFS鍒? 鍖猴紝“63”涓篣NIX鍒嗗尯錛岀瓑錛涜搗濮嬪拰緇撳熬鐨勬煴闈㈠彿銆佹墖鍖哄彿銆佺澶村彿鎸囨槑浜嗚鍒嗗尯鐨勮搗濮嬪拰緇堟浣嶇疆銆?<br /> 鎴戜滑鍋囪涓€涓‖鐩樺垎鍖鴻〃浠?BEH瀛楄妭寮€濮嬬殑16涓瓧鑺備負 80 01 01 00 06 0D 68 6D 28 00 00 00 78 20 03 00 <br /> 紜洏鍒嗗尯琛ㄩ」鐨?6涓瓧鑺傚垎閰嶅涓嬶細 <br /> 絎?瀛楄妭錛氭槸涓€涓垎鍖虹殑嬋€媧繪爣蹇楋紝琛ㄧず緋葷粺鍙紩瀵箋€傚鏄?鍒欒〃紺洪潪媧誨姩鍒嗗尯銆?<br /> 絎?瀛楄妭錛氳鍒嗗尯璧峰紓佸ご錛圚EAD錛夊彿 <br /> 絎?瀛楄妭錛氳鍒嗗尯璧峰鎵囧尯錛圫ector錛夊彿 <br /> 絎?瀛楄妭錛氳鍒嗗尯璧峰鐨勬煴闈紙Cylinder錛夊彿 <br /> 絎?瀛楄妭錛氳鍒嗗尯緋葷粺綾誨瀷鏍囧織 <br /> 絎?鈥?瀛楄妭錛氳鍒嗗尯緇堟紓佸ご錛圚EAD錛夊彿銆佸垎鍖虹粨鏉熺殑鎵囧尯鍙楓€佸垎鍖虹粨鏉熺殑鏌遍潰鍙?<br /> 絎?-12瀛楄妭錛氳鍒嗗尯棣栨墖鍖虹殑鐩稿鎵囧尯鍙?<br /> 絎?3-16瀛楄妭錛氳鍒嗗尯鍗犵敤鐨勬墖鍖烘€繪暟 <br /> 浠ヤ笂鍙傛暟鎴戜滑鍙互鐢∟U 8.0涓璂ISKEDIT宸ュ叿杞歡鍙交鏉捐幏鍙栵紝鍏跺姛鑳介潪甯稿己澶э紝浣嗗簲鐢ㄤ笉褰撲細鏈夊緢澶ч敊璇紝璇峰悇浣嶆敞鎰忎嬌鐢ㄦ柟娉曘€傛搷浣滄楠ゅ涓嬶細 <br /> 浠ヤ竴鍙扮‖鐩樹負270 MB錛屽垎涓篊鐩橈紙100 MB錛夊拰D鐩橈紙170 MB錛夌殑鏈哄瓙錛堣€佹帀鐗欎簡 ^_^錛変負渚嬶紝鍦ㄧ函DOS涓嬪惎鍔―ISKEDIT → 鍦ㄥ璞¤彍鍗曪紙Object錛変笂閫変腑椹卞姩鍣紙Drive錛夊拰鐗╃悊紓佺洏閫夐」鍚庣‘瀹?→ 鍦ㄥ璞¤彍鍗曪紙Object錛変笂閫変腑鍒嗗尯琛紙Partition Table錛?→ 鍦ㄦ樉紺鴻彍鍗曪紙View錛変腑閫夋嫨鍗佸叚榪涘埗錛圚ex錛?<br /> 浠ヤ笅鏁版嵁涓轟富鍒嗗尯淇℃伅錛?<br /> 000001B0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 80 01 <br /> 000001C0: 01 00 06 0D 68 6D 28 00 - 00 00 78 20 03 00 00 00 <br /> 000001D0: 41 6E 05 0D E8 AE A0 20 - 03 00 30 EE 04 00 00 00 <br /> 000001E0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 <br /> 000001F0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 55 AA <br /> 鈶?DBR錛圖os Boot Record 鎿嶄綔緋葷粺寮曞璁板綍鍖猴級 <br /> 瀹冮€氬父浣嶄簬紜洏鐨?紓侀亾1鏌遍潰1鎵囧尯錛屾槸鎿嶄綔緋葷粺鍙洿鎺ヨ闂殑絎竴涓墖鍖猴紝瀹冨寘鎷竴涓紩瀵肩▼搴忓拰涓€涓縐頒負BPB錛圔IOS Parameter Block錛夌殑鏈垎鍖哄弬鏁拌褰曡〃銆傚紩瀵肩▼搴忕殑涓昏浠誨姟鏄綋MBR灝嗙郴緇熸帶鍒舵潈浜ょ粰瀹冩椂錛屽垽鏂湰鍒嗗尯璺熺洰褰曞墠涓や釜鏂囦歡鏄笉鏄搷浣滅郴緇熺殑寮曞鏂囦歡錛堜互DOS涓? 渚嬶紝鍗蟲槸Io.sys鍜孧sodos.sys錛夈€傚鏋滅‘瀹氬瓨鍦紝灝辨妸瀹冧滑璇誨叆鍐呭瓨錛屽茍鎶婃帶鍒舵潈浜ょ粰璇ユ枃浠躲€侭PB鍙傛暟鍧楄褰曠潃鏈垎鍖虹殑璧峰鎵囧尯銆佺粨鏉熸墖 鍖恒€佹枃浠跺瓨鍌ㄦ牸寮忋€佺‖鐩樹粙璐ㄦ弿榪扮銆佹牴鐩綍澶у皬銆丗AT涓暟銆佸垎閰嶅崟鍏冪殑澶у皬絳夐噸瑕佸弬鏁般€侱BR鏄敱楂樼駭鏍煎紡鍖栫▼搴忥紙鍗矲ormat絳夌▼搴忥級鎵€浜х敓鐨勩€? <br /> 鈶?FAT錛團ile Allocation Table 鏂囦歡鍒嗛厤琛級 <br /> FAT鏄疍OS銆乄indows 9X緋葷粺鐨勬枃浠跺鍧€鏍煎紡錛屼綅浜嶥BR涔嬪悗銆?<br /> 鍦ㄨВ閲婃枃浠跺垎閰嶈〃鐨勬蹇電殑鏃跺€欙紝鎴戜滑鏈夊繀瑕佽皥璋堢皣錛圕luster錛夌殑姒傚康銆傛枃浠跺崰鐢ㄧ鐩樼┖闂達紝鍩烘湰鍗曚綅涓嶆槸瀛楄妭鑰屾槸綈囥€備竴鑸儏鍐典笅錛岃蔣鐩樻瘡綈囨槸1涓墖鍖猴紝紜洏姣忕皣鐨勬墖鍖烘暟涓庣‖鐩樼殑鎬誨閲忓ぇ灝忔湁鍏籌紝鍙兘鏄?銆?銆?6銆?2銆?4…… <br /> 鍚屼竴涓枃浠剁殑鏁版嵁騫朵笉涓€瀹氬畬鏁村湴瀛樻斁鍦ㄧ鐩樼殑涓€涓繛緇殑鍖哄煙鍐咃紝鑰屽線寰€浼氬垎鎴愯嫢騫叉錛屽儚涓€鏉¢摼瀛愪竴鏍峰瓨鏀俱€傝繖縐嶅瓨鍌ㄦ柟寮忕О涓烘枃浠剁殑閾懼紡瀛樺偍銆傜敱浜庣‖鐩樹笂淇? 瀛樼潃孌典笌孌典箣闂寸殑榪炴帴淇℃伅錛堝嵆FAT錛夛紝鎿嶄綔緋葷粺鍦ㄨ鍙栨枃浠舵椂錛屾€繪槸鑳藉鍑嗙‘鍦版壘鍒板悇孌電殑浣嶇疆騫舵紜鍑恒€?<br /> 涓轟簡瀹炵幇鏂囦歡鐨勯摼寮忓瓨鍌紝紜洏涓婂繀欏誨噯紜湴璁板綍鍝簺綈囧凡緇忚鏂囦歡鍗犵敤錛岃繕蹇呴』涓烘瘡涓凡緇忓崰鐢ㄧ殑綈囨寚鏄庡瓨鍌ㄥ悗緇у唴瀹圭殑涓嬩竴涓皣鐨勭皣鍙楓€傚涓€涓枃浠剁殑鏈€鍚庝竴 綈囷紝鍒欒鎸囨槑鏈皣鏃犲悗緇х皣銆傝繖浜涢兘鏄敱FAT琛ㄦ潵淇濆瓨鐨勶紝琛ㄤ腑鏈夊緢澶氳〃欏癸紝姣忛」璁板綍涓€涓皣鐨勪俊鎭€傜敱浜嶧AT瀵逛簬鏂囦歡綆$悊鐨勯噸瑕佹€э紝鎵€浠ヤ負浜嗗畨鍏ㄨ搗 瑙侊紝FAT鏈変竴涓浠斤紝鍗沖湪鍘烣AT鐨勫悗闈㈠啀寤轟竴涓悓鏍風殑FAT銆傚垵褰㈡垚鐨凢AT涓墍鏈夐」閮芥爣鏄庝負“鏈崰鐢?#8221;錛屼絾濡傛灉紓佺洏鏈夊眬閮ㄦ崯鍧忥紝閭d箞鏍煎紡鍖栫▼搴忎細媯€ 嫻嬪嚭鎹熷潖鐨勭皣錛屽湪鐩稿簲鐨勯」涓爣涓?#8220;鍧忕皣”錛屼互鍚庡瓨鏂囦歡鏃跺氨涓嶄細鍐嶄嬌鐢ㄨ繖涓皣浜嗐€侳AT鐨勯」鏁頒笌紜洏涓婄殑鎬葷皣鏁扮浉褰擄紝姣忎竴欏瑰崰鐢ㄧ殑瀛楄妭鏁頒篃瑕佷笌鎬葷皣鏁扮浉閫? 搴旓紝鍥犱負鍏朵腑闇€瑕佸瓨鏀劇皣鍙楓€侳AT鐨勬牸寮忔湁澶氱錛屾渶涓哄父瑙佺殑鏄疐AT16鍜孎AT32銆?<br /> 鈶?DIR 錛圖irectory 鏍圭洰褰曞尯錛?<br /> DIR浣嶄簬絎簩涓狥AT琛ㄤ箣鍚庯紝璁板綍鐫€鏍圭洰褰曚笅姣忎釜鏂囦歡錛堢洰褰曪級鐨勮搗濮嬪崟鍏冿紝鏂囦歡鐨勫睘鎬х瓑銆傚畾浣嶆枃浠朵綅緗椂錛屾搷浣滅郴緇熸牴鎹瓺IR涓殑璧峰鍗曞厓錛岀粨鍚團AT琛ㄥ氨鍙互鐭ラ亾鏂囦歡鍦ㄧ‖鐩樹腑鐨勫叿浣撲綅緗拰澶у皬浜嗐€?<br /> 鈶?DATA錛堟暟鎹尯錛?<br /> 鏁版嵁鍖烘槸鐪熸鎰忎箟涓婄殑鏁版嵁瀛樺偍鐨勫湴鏂癸紝浣嶄簬DIR鍖轟箣鍚庯紝鍗犳嵁紜洏鐨勫ぇ閮ㄥ垎絀洪棿銆傚綋灝嗘暟鎹鍒跺埌紜洏鏃訛紝鏁版嵁灝卞瓨鏀懼湪DATA鍖恒€?/div> </div> </div> <img src ="http://www.aygfsteel.com/shiliqiang/aggbug/290389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shiliqiang/" target="_blank">鐭沖ご@</a> 2009-08-08 22:31 <a href="http://www.aygfsteel.com/shiliqiang/articles/290389.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓€涓鍒欒〃杈懼紡宸ュ叿綾?/title><link>http://www.aygfsteel.com/shiliqiang/articles/290312.html</link><dc:creator>鐭沖ご@</dc:creator><author>鐭沖ご@</author><pubDate>Sat, 08 Aug 2009 01:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/shiliqiang/articles/290312.html</guid><wfw:comment>http://www.aygfsteel.com/shiliqiang/comments/290312.html</wfw:comment><comments>http://www.aygfsteel.com/shiliqiang/articles/290312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shiliqiang/comments/commentRss/290312.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shiliqiang/services/trackbacks/290312.html</trackback:ping><description><![CDATA[     鎽樿: 涓€涓猨ava姝h琛ㄨ揪寮忓伐鍏風被 綾諱腑鐢ㄥ埌浜?jakarta-oro-2.0.jar 鍖咃紝璇峰ぇ瀹惰嚜宸卞湪 apache緗戠珯涓嬩笅杞? 鍦ㄨ繖鏄痡unit嫻嬭瘯鍗曞厓綾繪垜灝變笉鎻愪氦浜嗭紝鍦╩ain()鏂規硶涓湁鍑犱釜灝忔祴璇曪紝鏈夊叴瓚h嚜宸辯帺鍚? 榪欎釜宸ュ叿綾葷洰鍓嶄富瑕佹湁25縐嶆瑙勮〃杈懼紡(鏈変簺涓嶅父鐢紝浣嗛偅鏃舵墠浠旂粏娣卞叆鐨勭爺絀朵簡涓€涓嬫瑙勶紝鍐欎笂鐦句簡錛屽氨褰撴椂鑳芥兂鍒扮殑閮藉啓浜?: 鍖歸厤鍥捐薄; 2 鍖歸厤email鍦?..  <a href='http://www.aygfsteel.com/shiliqiang/articles/290312.html'>闃呰鍏ㄦ枃</a><img src ="http://www.aygfsteel.com/shiliqiang/aggbug/290312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shiliqiang/" target="_blank">鐭沖ご@</a> 2009-08-08 09:01 <a href="http://www.aygfsteel.com/shiliqiang/articles/290312.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓€涓悎鏍肩殑紼嬪簭鍛樺簲鍏峰鐨勩€傘€傘€?/title><link>http://www.aygfsteel.com/shiliqiang/articles/289318.html</link><dc:creator>鐭沖ご@</dc:creator><author>鐭沖ご@</author><pubDate>Fri, 31 Jul 2009 12:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/shiliqiang/articles/289318.html</guid><wfw:comment>http://www.aygfsteel.com/shiliqiang/comments/289318.html</wfw:comment><comments>http://www.aygfsteel.com/shiliqiang/articles/289318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shiliqiang/comments/commentRss/289318.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shiliqiang/services/trackbacks/289318.html</trackback:ping><description><![CDATA[姣忎釜紼嬪簭鍛橀兘搴旂墷璁扮殑7縐嶅潖鍛抽亾錛?1縐嶅師鍒欙紝23縐嶆ā寮? <br /> <br /> (涓€)7縐嶈璁″潖鍛抽亾 <br /> 1.鍍靛寲鎬э細 寰堥毦瀵圭郴緇熻繘琛屾敼鍔紝鍥犱負姣忎釜鏀瑰姩閮戒細榪嬌璁稿瀵圭郴緇熷叾浠栭儴鍒嗙殑鍏跺畠鏀瑰姩銆? <br /> 2.鑴嗗急鎬э細 瀵圭郴緇熺殑鏀瑰姩浼氬鑷寸郴緇熶腑鍜屾敼鍔ㄧ殑鍦版柟鍦ㄦ蹇典笂鏃犲叧鐨勮澶氬湴鏂瑰嚭鐜伴棶棰樸€? <br /> 3.鐗㈠浐鎬э細 寰堥毦瑙e紑緋葷粺鐨勭籂緇擄紝浣夸箣鎴愪負涓€浜涘彲鍦ㄥ叾浠栫郴緇熶腑閲嶇敤鐨勭粍浠躲€? <br /> 4.綺樻粸鎬э細 鍋氭紜殑浜嬫儏姣斿仛閿欒鐨勪簨鎯呰鍥伴毦銆? <br /> 5.澶嶆潅鎬?涓嶅繀瑕佺殑)錛?璁捐涓寘鍚湁涓嶅叿浠諱綍鐩存帴濂藉鐨勫熀紜€緇撴瀯銆? <br /> 6.閲嶅鎬?涓嶅繀瑕佺殑)錛?璁捐涓寘鍚湁閲嶅鐨勭粨鏋勶紝鑰岃閲嶅鐨勭粨鏋勬湰鍙互浣跨敤鍗曚竴鐨勬娊璞¤繘琛岀粺涓€銆? <br /> 7.鏅︽訂鎬э細 寰堥毦闃呰銆佺悊瑙c€傛病鏈夊緢濂藉湴琛ㄧ幇鍑烘剰鍥俱€? <br /> <br /> (浜?11縐嶅師鍒?- Principle <br /> ----綾誨師鍒? <br /> 1.鍗曚竴鑱岃矗鍘熷垯 - Single Responsibility Principle(SRP) <br /> 灝變竴涓被鑰岃█錛屽簲璇ヤ粎鏈変竴涓紩璧峰畠鍙樺寲鐨勫師鍥犮€? <br /> (鑱岃矗鍗充負“鍙樺寲鐨勫師鍥?#8221;銆? <br /> 2.寮€鏀?灝侀棴鍘熷垯 - Open Close Principle(OCP) <br /> 杞歡瀹炰綋錛堢被銆佹ā鍧椼€佸嚱鏁扮瓑錛夊簲璇ユ槸鍙互鎵╁睍鐨勶紝浣嗘槸涓嶅彲淇敼銆? <br /> (瀵逛簬鎵╁睍鏄紑鏀劇殑,瀵逛簬鏇存敼鏄皝闂殑. <br /> 鍏抽敭鏄娊璞?灝嗕竴涓姛鑳界殑閫氱敤閮ㄥ垎鍜屽疄鐜扮粏鑺傞儴鍒嗘竻鏅扮殑鍒嗙寮€鏉? <br /> 寮€鍙戜漢鍛樺簲璇ヤ粎浠呭紼嬪簭涓憟鐜板嚭棰戠箒鍙樺寲鐨勯偅浜涢儴鍒嗕綔鍑烘娊璞? <br /> 鎷掔粷涓嶆垚鐔熺殑鎶借薄鍜屾娊璞℃湰韜竴鏍烽噸瑕? ) <br /> 3.閲屾皬鏇挎崲鍘熷垯 - Liskov Substitution Principle(LSP) <br /> 瀛愮被鍨?subclass)蹇呴』鑳藉鏇挎崲鎺夊畠浠殑鍩虹被鍨?superclass)銆? <br /> 4.渚濊禆鍊掔疆鍘熷垯(IoCP) 鎴?渚濊禆娉ㄥ叆鍘熷垯 - Dependence Inversion Principle(DIP) <br /> 鎶借薄涓嶅簲璇ヤ緷璧栦簬緇嗚妭銆傜粏鑺傚簲璇ヤ緷璧栦簬鎶借薄銆? <br /> (Hollywood鍘熷垯: "Don't call us, we'll call you". <br /> 紼嬪簭涓墍鏈夌殑渚濊禆鍏崇郴閮藉簲璇ョ粓姝簬鎶借薄綾誨拰鎺ュ彛銆? <br /> 閽堝鎺ュ彛鑰岄潪瀹炵幇緙栫▼銆? <br /> 浠諱綍鍙橀噺閮戒笉搴旇鎸佹湁涓€涓寚鍚戝叿浣撶被鐨勬寚閽堟垨寮曠敤銆? <br /> 浠諱綍綾婚兘涓嶅簲璇ヤ粠鍏蜂綋綾繪淳鐢熴€? <br /> 浠諱綍鏂規硶閮戒笉搴旇瑕嗗啓浠栫殑浠諱綍鍩虹被涓殑宸茬粡瀹炵幇浜嗙殑鏂規硶銆? <br /> 5.鎺ュ彛闅旂鍘熷垯(ISP) <br /> 涓嶅簲璇ュ己榪鎴蜂緷璧栦簬瀹冧滑涓嶇敤鐨勬柟娉曘€? <br /> 鎺ュ彛灞炰簬瀹㈡埛錛屼笉灞炰簬瀹冩墍鍦ㄧ殑綾誨眰嬈$粨鏋勩€? <br /> (澶氫釜闈㈠悜鐗瑰畾鐢ㄦ埛鐨勬帴鍙h儨浜庝竴涓€氱敤鎺ュ彛銆? <br /> ----鍖呭唴鑱氬師鍒? <br /> 6.閲嶇敤鍙戝竷絳変環鍘熷垯(REP) <br /> 閲嶇敤鐨勭矑搴﹀氨鏄彂甯冪殑綺掑害銆? <br /> 7.鍏卞悓灝侀棴鍘熷垯(CCP) <br /> 鍖呬腑鐨勬墍鏈夌被瀵逛簬鍚屼竴綾繪€ц川鐨勫彉鍖栧簲璇ユ槸鍏卞悓灝侀棴鐨勩€? <br /> 涓€涓彉鍖栬嫢瀵逛竴涓寘浜х敓褰卞搷錛? <br /> 鍒欏皢瀵硅鍖呬腑鐨勬墍鏈夌被浜х敓褰卞搷錛? <br /> 鑰屽浜庡叾浠栫殑鍖呬笉閫犳垚浠諱綍褰卞搷銆? <br /> 8.鍏卞悓閲嶇敤鍘熷垯(CRP) <br /> 涓€涓寘涓殑鎵€鏈夌被搴旇鏄叡鍚岄噸鐢ㄧ殑銆? <br /> 濡傛灉閲嶇敤浜嗗寘涓殑涓€涓被錛? <br /> 閭d箞灝辮閲嶇敤鍖呬腑鐨勬墍鏈夌被銆? <br /> (鐩鎬簰涔嬮棿娌℃湁绱у瘑鑱旂郴鐨勭被涓嶅簲璇ュ湪鍚屼竴涓寘涓€? <br /> ----鍖呰€﹀悎鍘熷垯 <br /> 9.鏃犵幆渚濊禆鍘熷垯(ADP) <br /> 鍦ㄥ寘鐨勪緷璧栧叧緋誨浘涓笉鍏佽瀛樺湪鐜€? <br /> 10.紼沖畾渚濊禆鍘熷垯(SDP) <br /> 鏈濈潃紼沖畾鐨勬柟鍚戣繘琛屼緷璧栥€? <br /> 搴旇鎶婂皝瑁呯郴緇熼珮灞傝璁$殑杞歡錛堟瘮濡傛娊璞$被錛夋斁榪涚ǔ瀹氱殑鍖呬腑錛? <br /> 涓嶇ǔ瀹氱殑鍖呬腑搴旇鍙寘鍚偅浜涘緢鍙兘浼氭敼鍙樼殑杞歡錛堟瘮濡傚叿浣撶被錛夈€? <br /> 11.紼沖畾鎶借薄鍘熷垯(SAP) <br /> 鍖呯殑鎶借薄紼嬪害搴旇鍜屽叾紼沖畾紼嬪害涓€鑷淬€? <br /> (涓€涓ǔ瀹氱殑鍖呭簲璇ヤ篃鏄娊璞$殑錛屼竴涓笉紼沖畾鐨勫寘搴旇鏄娊璞$殑. ) <br /> ----鍏跺畠鎵╁睍鍘熷垯---- <br /> 12.BBP(Black Box Principle)榛戠洅鍘熷垯 <br /> 澶氱敤綾葷殑鑱氬悎錛屽皯鐢ㄧ被鐨勭戶鎵褲€? <br /> 13.DAP(Default Abstraction Principle)緙虹渷鎶借薄鍘熷垯 <br /> 鍦ㄦ帴鍙e拰瀹炵幇鎺ュ彛鐨勭被涔嬮棿寮曞叆涓€涓娊璞$被,榪欎釜綾誨疄鐜頒簡鎺ュ彛鐨勫ぇ閮ㄥ垎鎿嶄綔. <br /> 14.IDP(Interface Design Principle)鎺ュ彛璁捐鍘熷垯 <br /> 瑙勫垝涓€涓帴鍙h€屼笉鏄疄鐜頒竴涓帴鍙c€? <br /> 15.DCSP(Don't Concrete Supperclass Principle)涓嶈鏋勯€犲叿浣撶殑瓚呯被鍘熷垯 <br /> 閬垮厤緇存姢鍏蜂綋鐨勮秴綾匯€? <br /> 16.榪背鐗規硶鍒? <br /> 涓€涓被鍙緷璧栧叾瑙︽墜鍙緱鐨勭被銆? <br /> <br /> (涓?23縐嶈璁℃ā寮?- Pattern. <br /> 鍒涘緩鍨? <br /> Abstract Factory錛堟娊璞″伐鍘傛ā寮忥級 -> (綆€鍗曞伐鍘傛ā寮? <br /> Factory Method錛堝伐鍘傛ā寮忥級 <br /> Builder錛堢敓鎴愬櫒妯″紡錛? <br /> Singleton錛堝崟浠舵ā寮忥級 -> (澶氫緥妯″紡) <br /> Prototype錛堝師鍨嬫ā寮忥級 <br /> 緇撴瀯鍨? <br /> Adapter錛堥€傞厤鍣ㄦā寮忥級 <br /> Bridge錛堟ˉ鎺ユā寮忥級 <br /> Composite錛堢粍鍚堟ā寮忥級 <br /> Decorator錛堣楗版ā寮忥級 <br /> Facade錛堝瑙傛ā寮忥紝闂ㄩ潰妯″紡錛? <br /> Flyweight錛堜韓鍏冩ā寮忥級 -> (涓嶅彉妯″紡) <br /> Proxy錛堜唬鐞嗘ā寮忥級 <br /> 琛屼負鍨? <br /> Chain of Responsibility錛堣亴璐i摼妯″紡錛? <br /> Command錛堝懡浠ゆā寮忥級 <br /> Interpreter錛堣В閲婂櫒妯″紡錛? <br /> Iteartor錛堣凱浠e櫒妯″紡錛? <br /> Mediator錛堜腑浠嬭€呮ā寮忥級 <br /> Memento錛堝蹇樺綍妯″紡錛? <br /> Observer錛堣瀵熻€呮ā寮忥級 <br /> State錛堢姸鎬佹ā寮忥級 <br /> Strategy錛堢瓥鐣ユā寮忥級 <br /> TemplateMethod錛堟ā鏉挎柟娉曟ā寮忥級 <br /> Visitor錛堣闂€呮ā寮忥級<br /> <br /> <br /> <br /> 鍑鴻嚜錛歨ttp://www.javaeye.com/topic/41096<br /> <img src ="http://www.aygfsteel.com/shiliqiang/aggbug/289318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shiliqiang/" target="_blank">鐭沖ご@</a> 2009-07-31 20:45 <a href="http://www.aygfsteel.com/shiliqiang/articles/289318.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>緗戠粶鏈嶅姟鍣ㄧ殑鎬ц兘鍒嗘瀽http://www.aygfsteel.com/shiliqiang/articles/288646.html鐭沖ご@鐭沖ご@Mon, 27 Jul 2009 14:13:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/288646.htmlhttp://www.aygfsteel.com/shiliqiang/comments/288646.htmlhttp://www.aygfsteel.com/shiliqiang/articles/288646.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/288646.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/288646.html闃呰鍏ㄦ枃

]]>
紼嬪簭鎬ц兘鍒嗘瀽http://www.aygfsteel.com/shiliqiang/articles/288641.html鐭沖ご@鐭沖ご@Mon, 27 Jul 2009 13:37:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/288641.htmlhttp://www.aygfsteel.com/shiliqiang/comments/288641.htmlhttp://www.aygfsteel.com/shiliqiang/articles/288641.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/288641.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/288641.html榪欑瘒鏂囩珷涓昏鏄兂璋堣皥鍦ㄤ互CPU涓轟腑蹇冪殑璁$畻浣撶郴緇撴瀯涓獎鍝嶇▼搴忔€ц兘鐨勪富瑕佸洜绱犲拰鎬ц兘鐨勫垎鏋愭柟娉曚互鍙婂綰跨▼瀵圭▼搴忔€ц兘鐨勫獎鍝嶏紝璇昏繖綃囨枃绔犻鍏堣鍏峰涓€瀹氱殑浣撶郴緇撴瀯鍜屾搷浣滅郴緇熷熀紜€錛岀壒鍒槸榪涚▼璋冨害錛屽緩璁湅銆?font face="Times New Roman">Operation System Concept銆嬶紙涓枃銆婃搷浣滅郴緇熸璁恒€嬶級銆?/font>
 
鍏堝畾涔変竴涓嬬▼搴忕殑鎬ц兘錛屽氨鏄湪鍗曚綅鏃墮棿鍐呰兘鎵ц鐨勪換鍔℃暟鎴栬€呮墽琛屾煇涓換鍔¢渶瑕佺殑鏃墮棿銆傛樉鐒訛紝鍦ㄦ洿鐭殑鏃墮棿鍐呮墽琛屾洿澶氱殑浠誨姟鎬ц兘灝辮秺楂樸€?/font>
 

CPU鍜?font face="Times New Roman">IO鎿嶄綔

 
璦€褰掓浼狅紝鍏堢湅涓€涓粡鍏哥殑鍏ラ棬鐨?font face="Times New Roman">C紼嬪簭Hello World!

int main(int argc, char * args[])
{
    int m = 0;
    for (int i = 0;i < 10;i ++)
    {
        m = m+i;
    }

    printf("Hello World! 1+2+…+10=%d\n", m);

    return 0;
}

榪欎釜涓嶇畻鍘熷鐨勭粡鍏哥殑Hello World錛屾瘮閭d釜Hello World紼嶅井澶嶆潅浜嗙偣錛屽姞浜嗕竴涓驚鐜紝鐢ㄦ潵璁$畻1+2+3…+10鐨勫€箋€?/font>
 
濡傛灉鏈変簡鎿嶄綔緋葷粺榪涚▼璋冨害鐨勫熀紜€錛屽彲浠ョ煡閬撹繖涓▼搴忓垎鎴愪袱孌墊墽琛岋紝絎竴孌墊槸璁$畻1+2+…+10鐨勫€鹼紝涓昏鍦?font face="Times New Roman">CPU錛堜腑澶鐞嗗崟鍏冿級涓繘琛岋紝C浠g爜錛?/font>

    int m = 0;
    for (int i = 0;i < 10;i ++)
    {
        m = m+i;
    }

絎簩孌墊槸灝嗚綆楃粨鏋滆緭鍑哄埌鎺у埗鍙扮殑榪欐錛屽皢涓€涓叉枃鏈€氳繃鏄懼崱椹卞姩錛屼紶閫佸埌鏄劇ず鍣ㄤ笂鏄劇ず錛屼富瑕佸湪鏄懼崱涓婅繘琛岋紝C浠g爜錛?/font>

printf("Hello World! 1+2+…+10=%d\n", m);

鏁翠釜紼嬪簭欏哄簭鎵ц錛屾墍浠?font face="Times New Roman">CPU鍏堣綆楀畬鎴愬緱鍒?font face="Times New Roman">1+2+…+10鐨勫€煎悗錛屽皢榪欎釜鍊艱漿鎹㈡垚涓€涓插瓧絎︿覆錛岀劧鍚庡皢瀛楃涓插彂閫佺粰鏄劇ず鍣紝絳夊緟鏄劇ず鍣ㄦ樉紺哄畬鎴愬悗錛屾暣涓▼搴忕粨鏉燂紝濡傛灉灝?font face="Times New Roman">CPU鎵ц琛ㄧず涓鴻摑鑹詫紝灝嗘樉紺哄櫒鎵ц琛ㄧず涓虹孩鑹詫紝閭d箞紼嬪簭鎵ц嫻佺▼濡備笅錛?/font>
500)this.width=500;" border="0">
鍥?font face="Times New Roman">1
鍋囪CPU涓綆?font face="Times New Roman">1+2+…+10鍜屽皢榪欎釜鍊煎彉鎴愬瓧絎︿覆鑺辮垂浜?font face="Times New Roman">11ns錛堢撼縐掞級錛岃€屾樉鍗″皢瀛楃涓叉樉紺哄埌鏄劇ず鍣ㄤ笂鑺辮垂浜?font face="Times New Roman">7ns錛岄偅涔堟暣涓▼搴忚繍琛岃姳璐逛簡18ns銆?/font>
 
Hello World鏄渶綆€鍗曠殑紼嬪簭錛屼篃鏄墍鏈夊叾浠栫▼搴忕殑鍩虹錛屽湪浠?font face="Times New Roman">CPU涓轟腑蹇冪殑璁$畻鏈虹粨鏋勪腑錛屽唴瀛樿礋璐g▼搴忕殑瀛樺偍錛?font face="Times New Roman">CPU璐熻矗紼嬪簭鐨勮繍綆楀拰嫻佺▼鎺у埗錛屽叾浠栧厓浠惰鐪嬫垚璺熶笂闈?font face="Times New Roman">Hello World涓樉鍗$被浼肩殑澶栧洿璁懼錛屼篃琚О浣?font face="Times New Roman">IO璁懼錛屾墍浠ヤ換浣曠▼搴忛兘鍙互鐪嬩綔鏄竴緋誨垪CPU鎿嶄綔鍜屼竴緋誨垪IO鎿嶄綔鐨勭鍚堜綋錛屽涓嬪浘鎵€紺猴細
500)this.width=500;" border="0" width="500">
鍥?font face="Times New Roman">2
鎵€浠ュ獎鍝嶇▼搴忔€ц兘鐨勪富瑕佸洜绱犳湁涓や釜鏂歸潰錛氫竴鏄?font face="Times New Roman">CPU鎿嶄綔鐨勫揩鎱紝浜屾槸IO鎿嶄綔鐨勫揩鎱€€?/strong>
 
鎵€浠ョ▼搴忔€ц兘鍒嗘瀽鐨勪富瑕佹柟娉曞氨鏄紜尯鍒嗗摢浜涙槸CPU鎿嶄綔錛屽摢浜涙槸IO鎿嶄綔銆?/strong>
 
CPU鎿嶄綔閫氬父鏈夎繖浜涳細
璧嬪€煎拰璁$畻錛屽錛?font face="Times New Roman">m = i*j;
嫻佺▼鎺у埗錛屽錛?font face="Times New Roman">while(true) { i ++;}
 
IO鎿嶄綔閫氬父鏈夎繖浜涳細
紓佺洏鏂囦歡鎿嶄綔銆?/font>
緗戠粶鎿嶄綔銆?/font>
閿洏鍜岄紶鏍囨搷浣溿€?/font>
鏄懼崱鎿嶄綔錛屽鍦ㄥ睆騫曚笂緇樺浘錛屾樉紺烘枃鏈瓑銆?/font>
USB鎿嶄綔銆?/font>
涓插彛鎿嶄綔銆?/font>
綰㈠綰挎搷浣溿€?/font>
紓佸甫鏈烘搷浣溿€?/font>
閫氬父闄?font face="Times New Roman">CPU鍜屽唴瀛樺鐨勫叾浠栬澶囬兘鍙互鐪嬫垚IO鎿嶄綔錛屽唴瀛樹箣鎵€浠ヤ笉鐪嬩綔IO璁懼錛屾槸鍥犱負鍐呭瓨璁塊棶鐩稿IO鑰岃█錛岄€氬父瑕佸揩鍑犱釜鏁伴噺綰э紝鎵€浠ュ儚char * buff = new char[100];榪欐牱鐨勬搷浣滈€氬父涔熺湅浣?font face="Times New Roman">CPU鎿嶄綔銆?/font>
 
閫氳繃鍒嗘瀽鍒掑垎鍑虹▼搴忕殑CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔紼嬪簭孌靛悗錛屽彲浠ユ湁閽堝鎬х殑榪涜浼樺寲銆?/strong>
 
瀵逛簬CPU鎿嶄綔錛屽父鐢ㄧ殑鎻愬崌鎬ц兘鐨勬柟娉曟槸浼樺寲璁$畻鍜屾祦紼嬫帶鍒朵唬鐮侊紝濡傜浉涔樿綆?font face="Times New Roman"> m = i * 8錛屽彲浠ヤ嬌鐢?font face="Times New Roman"> m = i << 3錛屽洜涓轟綅鎿嶄綔姣斾箻娉曟搷浣滈€熷害蹇紝閫氬父鍦ㄦ煇縐嶈璦€涓兘浼氳鍒扮▼搴忕殑浼樺寲錛屽氨灞炰簬浼樺寲CPU鎿嶄綔閫熷害銆?/font>
瀵逛簬IO鎿嶄綔錛屽鏋?font face="Times New Roman">IO鎿嶄綔榪囦簬棰戠箒鑰屾垚涓虹郴緇熺摱棰堬紝鍙互娓呴櫎涓€浜涗笉蹇呰鐨?font face="Times New Roman">IO鎿嶄綔錛屼篃鍙互鏇存崲閫熷害鏇村揩鐨?font face="Times New Roman">IO璁懼鏉ユ彁楂橀€熷害錛屽鎶婄‖鐩樹粠5400杞彁鍗囧埌7200杞€?/font>
 

澶氱嚎紼?/font>

 
涓嬮潰鐪嬬湅澶氱嚎紼嬪紼嬪簭鎬ц兘鐨勫獎鍝嶏紝浠€涔堟椂鍊欒浣跨敤澶氱嚎紼嬶紝浠€涔堟椂鍊欎嬌鐢ㄥ綰跨▼杈句笉鍒伴鏈熺殑鏁堟灉銆?/font>
澶氱嚎紼嬫槸紼嬪簭閲岄潰鏈夊儚涓婇潰閭f牱鐨勫涓墽琛屾祦紼嬶紝榪欎簺鎵ц嫻佺▼鐙珛鎴栬€呰仈鍚堣搗鏉ュ畬鎴愭煇浜涗換鍔°€?/font>
鍏堢湅鐪嬭綆楁満鍙湁涓€涓?font face="Times New Roman">CPU錛屼竴涓?font face="Times New Roman">IO璁懼錛岀▼搴忔湁涓や釜綰跨▼錛屼袱涓嚎紼嬫墽琛屽悓鏍風殑浠g爜錛屽彲浠ョ敾鍑烘墽琛屾祦紼嬶細
500)this.width=500;" border="0" width="500">
鍥?font face="Times New Roman">3
綰跨▼1鎸夋甯哥殑鎵ц嫻佺▼鎵ц錛岀嚎紼?font face="Times New Roman">2铏界劧璺熺嚎紼?font face="Times New Roman">1鎵ц鍚屾牱鐨勪唬鐮侊紝鍗村嚭鐜板緢澶氫笉榪炵畫鐨勭墖孌碉紝姣斿2.2à2.3鍜?font face="Times New Roman">2.4à2.5錛岃繖鏄洜涓哄彧鏈変竴涓?font face="Times New Roman">CPU錛屾墍浠?font face="Times New Roman">CPU鍦ㄨ繘琛岀嚎紼?font face="Times New Roman">1鐨?font face="Times New Roman">CPU鎿嶄綔鏃訛紝涓嶈兘鍚屾椂榪涜綰跨▼2鐨?font face="Times New Roman">CPU鎿嶄綔錛屼篃灝辨槸2.4鍜?font face="Times New Roman">2.5鏈潵鏄窡綰跨▼1鐨?font face="Times New Roman">1.3浠g爜涓€鏍鳳紝浣嗘槸鍗磋CPU鍒嗕袱嬈℃墽琛岋紝鍥犱負CPU姝e湪鎵ц1.7銆?font face="Times New Roman">2.2鍜?font face="Times New Roman">2.3涔熸槸鍚屾牱鐨勯亾鐞嗭紝鍥犱負IO璁懼瑕佹墽琛?font face="Times New Roman">1.4鐨勪唬鐮侊紝鎵€浠?font face="Times New Roman">2.2鍜?font face="Times New Roman">2.3琚墦鏂€備絾鏄袱涓嚎紼嬬殑CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔鍦ㄦ椂闂翠笂鍙互閲嶅彔錛屽洜涓轟粬浠槸涓嶅悓鐨勮澶囥€?/font>
涔熷氨鏄湪鏃墮棿涓婏紝CPU鍜?font face="Times New Roman">IO璁懼鍙兘鍚屾椂鍋氫竴浠朵簨鎯咃紝CPU鍜?font face="Times New Roman">IO璁懼鍙互鍚勮嚜鍋氳嚜宸辯殑浜嬫儏銆?/strong>
鑰冨療涓€縐嶆瀬绔殑鎯呭喌錛屽亣璁炬煇涓▼搴忔病鏈?font face="Times New Roman">IO鎿嶄綔錛屽彧鏈?font face="Times New Roman">CPU鎿嶄綔錛岄偅涔堟祦紼嬪浘鍙樻垚錛?/font>
500)this.width=500;" border="0" width="500">
鍥?font face="Times New Roman">4
綰跨▼1灝嗗崰鐢ㄦ墍鏈夌殑CPU鏃墮棿錛岀嚎紼?font face="Times New Roman">2灝嗕竴鐩寸瓑寰呯洿鍒扮嚎紼?font face="Times New Roman">1瀹屾垚錛屽洜涓虹嚎紼?font face="Times New Roman">1瀹屾垚浠誨姟鍚庯紝渚濈劧鍙互鍐嶆鎵ц浠誨姟錛屾墍浠ヨ繖鏃朵嬌鐢ㄧ嚎紼?font face="Times New Roman">1瀹屾垚浠誨姟鍜屼嬌鐢ㄧ嚎紼?font face="Times New Roman">2瀹屾垚浠誨姟娌℃湁鍖哄埆錛屼篃灝辨槸綰跨▼2鐨勫瓨鍦ㄥ茍涓嶄細璁╃▼搴忓瀹屾垚涓€浜涗換鍔★紝鎵€浠ョ嚎紼?font face="Times New Roman">2鐨勫瓨鍦紝騫朵笉鑳芥彁鍗囩▼搴忔€ц兘銆?/font>
鎵€浠ワ紝濡傛灉涓€涓▼搴忓彧鏈?font face="Times New Roman">CPU鎿嶄綔錛岄偅涔堝綰跨▼騫朵笉鑳芥彁鍗囩▼搴忔€ц兘銆?/strong>
鍚岀悊錛屽鏋滀竴涓▼搴忓彧鏈?font face="Times New Roman">IO鎿嶄綔錛岄偅涔堝綰跨▼騫朵笉鑳芥彁鍗囩▼搴忔€ц兘銆?/strong>
 
浣嗘槸澶氱嚎紼嬪湪鐜板疄涓‘瀹炴湁鎻愰珮紼嬪簭鎬ц兘鐨勬椂鍊欙紝閭f槸鍥犱負瀹為檯鐨勭▼搴忓儚鍥?font face="Times New Roman">3閭f牱錛屾湁CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔緇勬垚錛?font face="Times New Roman">CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔鍦ㄦ椂闂翠笂鍙互閲嶅彔錛屾墍浠ワ紝鍚屼竴鏃墮棿鍐咃紝紼嬪簭鍙互鍋氭洿澶氱殑浜嬫儏銆?/font>
濡傛灉涓€涓嚎紼嬩腑CPU鎿嶄綔鏃墮棿涓?font face="Times New Roman">M錛?font face="Times New Roman">IO鎿嶄綔鏃墮棿涓?font face="Times New Roman">N錛岄偅涔堝湪鍗曚綅鏃墮棿鍐咃紝騫沖潎鏈?font face="Times New Roman">M/(M+N)鍦ㄥ鐞?font face="Times New Roman">CPU鎿嶄綔錛屾湁N/(M+N)鐨勬椂闂?font face="Times New Roman">CPU絀洪棽錛屽鏋滆璁?font face="Times New Roman">CPU鍏呭垎鍒╃敤錛岄偅涔堝彲浠ュ鍔?font face="Times New Roman">(N/(M+N))/(M/(M+N))=N/M涓嚎紼嬫潵濉ˉCPU鎿嶄綔鐨勭┖鐧斤紝榪欐牱CPU鑳?font face="Times New Roman">100%琚埄鐢紝濡傛灉綰跨▼鍐嶅鍔狅紝CPU娌℃湁絀洪棽錛屽嚑涔庝笉浼氬鍔犵▼搴忔€ц兘銆?/font>
鎵€浠ワ紝璁?font face="Times New Roman">CPU 100%鍒╃敤鐨勭嚎紼嬫渶澶ф暟涓?font face="Times New Roman">1+N/M銆?/strong>
鍚屼綘錛岃IO璁懼100%鍒╃敤鐨勭嚎紼嬫渶澶ф暟涓?font face="Times New Roman">1+M/N銆?/strong>
榪欎袱涓叕寮忓彧鏄竴涓害閲忓紡錛屼笉鏄竴涓綆楀紡錛屽洜涓洪殢鐫€綰跨▼鏁扮殑澧炲姞錛?font face="Times New Roman">CPU鎿嶄綔鏃墮棿鍜?font face="Times New Roman">IO鎿嶄綔鏃墮棿灝嗕細闅忕潃鍙樺寲錛?font face="Times New Roman">M鍜?font face="Times New Roman">N涓嶅啀鍥哄畾銆?/font>
 
鐪嬩袱縐嶅父鐢ㄧ殑紼嬪簭錛屾湇鍔″櫒紼嬪簭鍜岀敤鎴蜂氦浜掔▼搴忋€?/font>
鏈嶅姟鍣ㄧ▼搴忛€氬父鎻愪緵鏌愮緗戠粶鏈嶅姟錛屽WEB鏈嶅姟鍣紝榪欑紼嬪簭瑕佹眰鑳芥渶澶у寲鐨勫埄鐢?font face="Times New Roman">CPU鍜?font face="Times New Roman">IO錛屽湪鍗曚綅鏃墮棿鍐呭鐞嗗敖鍙兘澶氱殑浠誨姟錛屾墍浠ュ簲璇ヤ嬌鐢ㄥ敖鍙兘鏃?font face="Times New Roman">CPU鍜?font face="Times New Roman">IO閮芥弧絎﹀悎宸ヤ綔錛屽綰跨▼鏁板彲浠ュ彇1+N/M鍜?font face="Times New Roman">1+M/N涓緝灝忕殑鍊鹼紝濡傛灉瑙傚療鏈嶅姟鍣ㄧ殑CPU鍜?font face="Times New Roman">IO浣跨敤鐜囷紝浼氬彂鐜頒粬浠父甯告帴榪?font face="Times New Roman">90%銆?/font>
鐢ㄦ埛浜や簰紼嬪簭閫氬父鏍規嵁鐢ㄦ埛鐨勬煇浜涜緭鍏ヨ繘琛岀浉搴旂殑鎿嶄綔錛屾搷浣滃畬鎴愬啀嬈$瓑寰呯敤鎴瘋緭鍏ワ紝濡?font face="Times New Roman">Microsoft Word錛岃姹傚鐢ㄦ埛鐨勮緭鍏ヨ兘鍙婃椂鍙嶅簲錛屾墍浠ユ搷浣滅嚎紼嬬殑CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔搴旇鏈変竴瀹氱殑絀洪棽錛屼嬌寰楃敤鎴瘋緭鍏ョ嚎紼嬭兘闅忔椂鑾峰彇CPU鏉ュ搷搴旂敤鎴風殑杈撳叆錛屼嬌鐢?font face="Times New Roman">Microsoft Windows鏃訛紝鎵撳紑浠誨姟綆$悊鍣紝鍙互鍙戠幇CPU浣跨敤鐜囧父甯稿緢浣庯紝濡?font face="Times New Roman">1%锝?font face="Times New Roman">20%銆?/font>
 

IO澶嶇敤

 
浠庝笂闈㈢殑鍒嗘瀽鍙互鐪嬪嚭錛屽綰跨▼鎻愬崌紼嬪簭鎬ц兘錛屼富瑕佸緱鐩婁簬璁?font face="Times New Roman">CPU鍜?font face="Times New Roman">IO璁懼鑳藉茍琛屾搷浣滐紝鍙︿竴縐嶈CPU鍜?font face="Times New Roman">IO璁懼騫惰鎿嶄綔鐨勬柟娉曟槸IO澶嶇敤錛屽熀鏈殑鎬濇兂鏄渶瑕佽繘琛?font face="Times New Roman">IO鎿嶄綔鏃訛紝鍙槸鍙戦€佷竴涓?font face="Times New Roman">IO鎿嶄綔璇鋒眰緇?font face="Times New Roman">IO璁懼鑰屼笉蹇呯瓑寰?font face="Times New Roman">IO瀹屾垚錛?font face="Times New Roman">CPU鎿嶄綔鍙互緇х畫榪涜錛?font face="Times New Roman">IO鎿嶄綔瀹屾垚鍚庨€氳繃鏌愮鏂規硶濡備簨浠墮€氱煡紼嬪簭錛岀劧鍚庣▼搴忓仛鐩稿簲鐨勫鐞嗭紝嫻佺▼濡備笅錛?/font>
500)this.width=500;" border="0" width="500">
鍥?font face="Times New Roman">5
浠ュ墠闇€瑕?font face="Times New Roman">18ns鎵ц鐨勭▼搴忥紝鐜板湪鍙渶瑕?font face="Times New Roman">11ns灝卞彲浠ュ畬鎴愶紝鎬ц兘鎻愬崌銆?/font>
甯哥敤鐨勬枃浠跺紓姝ユ搷浣溿€佺綉緇滃紓姝ユ搷浣滈兘灞炰簬IO澶嶇敤銆?/font>
浣跨敤IO澶嶇敤鍚庯紝紼嬪簭閫氬父鍙渶瑕佷竴涓嚎紼嬪氨鍙互瀹屾垚鎵€鏈夌殑鍔熻兘錛屽噺灝戞搷浣滅郴緇熺嚎紼嬮棿鍒囨崲鐨勫紑閿€錛屽茍涓斾笉闇€瑕佺嚎紼嬮棿鍚屾錛屼絾鏄?font face="Times New Roman">IO澶嶇敤闇€瑕佷嬌鐢ㄧ壒瀹氱殑鏂規硶鐩戣IO鐘舵€侊紝寮€鍙戠浉瀵規瘮杈冨鏉傘€?/font>
Window 2000鐨?font face="Times New Roman">IOCP錛?font face="Times New Roman">IO Complete Port錛夊氨鏄熀浜?font face="Times New Roman">IO澶嶇敤鐨勬€濇兂銆?/font>

鎬葷粨

铏界劧涓婇潰鐨勭粨璁烘槸鍦ㄤ竴涓?font face="Times New Roman">CPU騫朵笖娌℃湁鑰冭檻鎿嶄綔緋葷粺鐨勮繘紼嬭皟搴﹀拰鍐呭瓨綆$悊絳夊洜绱犵殑褰卞搷鐨勫墠鎻愪笅寰楀嚭鐨勶紝浣嗘槸鍦ㄤ互CPU涓轟腑蹇冪殑璁$畻鏈轟綋緋葷粨鏋勪腑錛?font face="Times New Roman">CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔鐨勫垝鍒嗙‘瀹炴櫘閬嶉€傜敤鐨勶紝榪涚▼璋冨害鍜屽唴瀛樼鐞嗘湰韜篃鍙互鐪嬫垚鏄?font face="Times New Roman">CPU鎿嶄綔鍜?font face="Times New Roman">IO鎿嶄綔澶嶅悎鐨勭▼搴忥紝瀵逛簬澶?font face="Times New Roman">CPU鐨勭郴緇熷拰澶?font face="Times New Roman">IO璁懼鐨勭郴緇燂紝鍒嗘瀽鐨勫熀紜€鏄墍鏈夎繖浜涜澶囪兘騫惰鎿嶄綔錛屾墍浠ヤ笂闈㈠緱鍑虹殑緇撹鏄櫘閬嶉€傜敤鐨勩€?/font>
鍦ㄥ垎鏋愯繃紼嬩腑錛屽寰堝緇撹浣跨敤浜嗙矖浣撳瓧錛屾槸涓轟簡閱掔洰錛屼笉瑕佹璁扮‖鑳岋紝瑕佽浣忕殑鏄熀鏈師鐞嗗拰鍒嗘瀽鏂規硶錛岃繖鏍鋒墠鑳芥斁涔嬪洓嫻瘋€岀殕鍑嗐€?br />

杞嚜錛歨ttp://blog.chinaunix.net/u1/52224/showart_417513.html


]]>鏂囨湰澶勭悊(涓€)鐘舵€佹満(2) http://www.aygfsteel.com/shiliqiang/articles/286321.html鐭沖ご@鐭沖ご@Fri, 10 Jul 2009 13:16:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/286321.htmlhttp://www.aygfsteel.com/shiliqiang/comments/286321.htmlhttp://www.aygfsteel.com/shiliqiang/articles/286321.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/286321.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/286321.html緋葷粺紼嬪簭鍛樻垚闀胯鍒?鏂囨湰澶勭悊(涓€)

鐘舵€佹満(2)

o 鐢ㄦ湁絀風姸鎬佹満瑙d竴閬撻潰璇曢銆?/p>

鍒氭瘯涓氱殑鏃跺€欙紝鎴戝埌涓€瀹跺浼侀潰璇曪紝闈㈣瘯棰橀噷鏈夎繖鏍蜂竴閬撻錛?/p>

緇熻涓€綃囪嫳鏂囨枃绔犻噷鐨勫崟璇嶄釜鏁般€?/p>

鏈夊縐嶆柟娉曞彲浠ヨВ榪欓亾棰橈紝榪欓噷鎴戜滑閫夋嫨鐢ㄦ湁絀風姸鎬佹満鏉ヨВ錛屽仛娉曞涓嬶細

鍏堟妸榪欑瘒鑻辨枃鏂囩珷璇誨叆鍒頒竴涓紦鍐插尯閲岋紝璁╀竴涓寚閽堜粠緙撳啿鍖虹殑澶撮儴涓€鐩寸Щ鍒扮紦鍐插尯鐨勫熬閮紝鎸囬拡浼氬浜庝袱縐嶇姸鎬侊細“鍗曡瘝鍐?#8221;鎴?#8220;鍗曡瘝澶?#8221;錛屽姞涓婂悗闈㈡彁鍒扮殑鍒濆鐘舵€佸拰鎺ュ彈鐘舵€侊紝灝辨槸鏈夌┓鐘舵€佹満鐨勭姸鎬侀泦銆傜紦鍐插尯涓殑瀛楃闆嗗悎灝辨槸鏈夌┓鐘舵€佹満鐨勫瓧姣嶈〃銆?/p>

濡傛灉褰撳墠鐘舵€佷負“鍗曡瘝鍐?#8221;錛岀Щ鍒版寚閽堟椂錛屾寚閽堟寚鍚戠殑瀛楃鏄潪鍗曡瘝瀛楃(濡傛爣鐐瑰拰絀烘牸)錛岄偅鐘舵€佷細浠?#8220;鍗曡瘝鍐?#8221;杞崲鍒?#8220;鍗曡瘝澶?#8221;銆傚鏋滃綋鍓嶇姸鎬佷負“鍗? 璇嶅”錛?縐誨埌鎸囬拡鏃訛紝鎸囬拡鎸囧悜鐨勫瓧絎︽槸鍗曡瘝瀛楃(濡傚瓧姣?錛岄偅鐘舵€佷細浠?#8220;鍗曡瘝澶?#8221;杞崲鍒?#8220;鍗曡瘝鍐?#8221;銆傝繖浜涜漿鎹㈣鍒欏氨鏄姸鎬佽漿鎹㈠嚱鏁般€?/p>

鎸囬拡鎸囧悜緙撳啿鍖虹殑澶撮儴鏃舵槸鍒濆鐘舵€併€?/p>

鎸囬拡鎸囧悜緙撳啿鍖虹殑灝鵑儴鏃舵槸鎺ュ彈鐘舵€併€?/p>

姣忔褰撶姸鎬佷粠“鍗曡瘝鍐?#8221;杞崲鍒?#8220;鍗曡瘝澶?#8221;鏃訛紝鍗曡瘝璁℃暟澧炲姞涓€銆?br /> 榪欎釜鏈夌┓鐘舵€佹満鐨勫浘褰㈣〃紺哄涓嬶細

涓嬮潰鎴戜滑鐪嬬湅紼嬪簭鎬庝箞鍐欙細

int count_word(const char* text)

{

/*瀹氫箟鍚勭鐘舵€侊紝鎴戜滑涓嶅叧蹇冩帴鍙楃姸鎬侊紝榪欓噷鍙互涓嶇敤瀹氫箟銆?/

enum _State

{

STAT_INIT,

STAT_IN_WORD,

STAT_OUT_WORD,

}state = STAT_INIT;



int count = 0;

const char* p = text;



/*鍦ㄤ竴涓驚鐜腑錛屾寚閽堜粠緙撳啿鍖哄ご縐誨姩緙撳啿鍖哄熬*/

for(p = text; *p != '\0'; p++)

{

switch(state)

{

case STAT_INIT:

{

if(IS_WORD_CHAR(*p))

{

/*鎸囬拡鎸囧悜鍗曡瘝瀛楃錛岀姸鎬佽漿鎹負鍗曡瘝鍐?/

state = STAT_IN_WORD;

}

else

{

/*鎸囬拡鎸囧悜闈炲崟璇嶅瓧絎︼紝鐘舵€佽漿鎹負鍗曡瘝澶?/

state = STAT_OUT_WORD;

}

break;

}

case STAT_IN_WORD:

{

if(!IS_WORD_CHAR(*p))

{

/*鎸囬拡鎸囧悜闈炲崟璇嶅瓧絎︼紝鐘舵€佽漿鎹負鍗曡瘝澶栵紝澧炲姞鍗曡瘝璁℃暟*/

count++;

state = STAT_OUT_WORD;

}

break;

}

case STAT_OUT_WORD:

{

if(IS_WORD_CHAR(*p))

{

/*鎸囬拡鎸囧悜鍗曡瘝瀛楃錛岀姸鎬佽漿鎹負鍗曡瘝鍐?/

state = STAT_IN_WORD;

}

break;

}

default:break;

}

}



if(state == STAT_IN_WORD)

{

/*濡傛灉鐢卞崟璇嶅唴榪涘叆鎺ュ彈鐘舵€侊紝澧炲姞鍗曡瘝璁℃暟*/

count++;

}



return count;

}

鐢ㄧ姸鎬佹満鏉ヨВ榪欓亾棰樼洰錛屾€濊礬娓呮櫚錛岀▼搴忕畝鍗曪紝涓嶆槗鍑洪敊銆?/p>

榪欓亾棰樼洰鍙槸涓轟簡灞曠ず涓€浜涘鎶€娣閥錛岃繕鏄湁涓€浜涘疄闄呯敤澶勫憿錛熷洖絳旇繖涓棶棰樹箣鍓嶏紝鎴戜滑鍏堝涓婇潰鐨勭▼搴忓仛鐐規墿灞曪紝涓嶅彧鏄粺璁″崟璇嶇殑涓暟錛岃€屼笖瑕佸垎紱誨嚭閲岄潰鐨勬瘡涓崟璇嶃€?/p>

int word_segmentation(const char* text, OnWordFunc on_word, void* ctx)

{

enum _State

{

STAT_INIT,

STAT_IN_WORD,

STAT_OUT_WORD,

}state = STAT_INIT;



int count = 0;

char* copy_text = strdup(text);

char* p = copy_text;

char* word = copy_text;



for(p = copy_text; *p != '\0'; p++)

{

switch(state)

{

case STAT_INIT:

{

if(IS_WORD_CHAR(*p))

{

word = p;

state = STAT_IN_WORD;

}

break;

}

case STAT_IN_WORD:

{

if(!IS_WORD_CHAR(*p))

{

count++;

*p = '\0';

on_word(ctx, word);

state = STAT_OUT_WORD;

}

break;

}

case STAT_OUT_WORD:

{

if(IS_WORD_CHAR(*p))

{

word = p;

state = STAT_IN_WORD;

}

break;

}

default:break;

}

}



if(state == STAT_IN_WORD)

{

count++;

on_word(ctx, word);

}



free(copy_text);



return count;

}

鐘舵€佹満涓嶅彉錛屽彧鏄湪鐘舵€佽漿鎹㈡椂錛屽仛鏄簨鎯呬笉涓€鏍楓€傝繖閲屼粠“鍗曡瘝鍐?#8221;杞崲鍒板叾瀹冪姸鎬佹椂錛屽鍔犲崟璇嶈鏁幫紝騫跺垎紱誨嚭褰撳墠鐨勫崟璇嶃€傝嚦浜庢嬁鍒嗙鍑虹殑鍗曡瘝鏉ュ仛浠€涔堬紝鐢變紶鍏ョ殑鍥炶皟鍑芥暟鍐沖畾錛屾瘮濡傚彲浠ョ敤鏉ョ粺璁℃瘡涓崟璇嶅嚭鐜扮殑棰戠巼銆?/p>

浣嗗鏋滆璁鴻繕鏄檺浜庤嫳鏂囨枃绔狅紝榪欎釜紼嬪簭鐨勬剰涔変粛鐒朵笉澶э紝鐜板湪鏉ュ仛榪涗竴姝ユ墿灞曘€傛垜浠€冭檻鐨勬枃鏈笉鍐嶆槸鑻辨枃鏂囩珷錛岃€屾槸涓€浜涙枃鏈暟鎹紝榪欎簺鏁版嵁鐢變竴浜涘垎闅旂鍒嗗紑錛屾垜浠妸鏁版嵁縐頒負token錛岀幇鍦ㄦ垜浠鎶婅繖浜泃oken鍒嗙鍑烘潵銆?/p>

typedef void (*OnTokenFunc)(void* ctx, int index, const char* token);



#define IS_DELIM(c) (strchr(delims, c) != NULL)

int parse_token(const char* text, const char* delims, OnTokenFunc on_token, void* ctx)

{

enum _State

{

STAT_INIT,

STAT_IN,

STAT_OUT,

}state = STAT_INIT;



int count = 0;

char* copy_text = strdup(text);

char* p = copy_text;

char* token = copy_text;



for(p = copy_text; *p != '\0'; p++)

{

switch(state)

{

case STAT_INIT:

case STAT_OUT:

{

if(!IS_DELIM(*p))

{

token = p;

state = STAT_IN;

}

break;

}

case STAT_IN:

{

if(IS_DELIM(*p))

{

*p = '\0';

on_token(ctx, count++, token);

state = STAT_OUT;

}

break;

}

default:break;

}

}



if(state == STAT_IN)

{

on_token(ctx, count++, token);

}



on_token(ctx, -1, NULL);

free(copy_text);



return count;

}

鐢ㄥ垎闅旂鍒嗛殧鐨勬枃鏈暟鎹湁寰堝錛屽錛?/p>

鐜PATH錛屽畠鐢?#8216;:’鍒嗗紑鐨勫涓礬寰勭粍鎴愩€傚錛?br /> /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/backup/tools/jdk1.5.0_18/bin/:/usr/lib/ccache:/usr/local/bin:/bin:/usr/bin:/home/lixianjing/bin

鏂囦歡鍚嶏紝瀹冪敱‘/’鍒嗗紑鐨勮礬寰勭粍鎴愩€傚錛?br /> /usr/lib/qt-3.3/bin

URL涓殑鍙傛暟錛屽畠‘&’鍒嗗紑鐨勫涓猭ey/value瀵圭粍鎴愩€?br /> hl=zh-CN&q=limodev&btnG=Google+鎼滅儲&meta=&aq=f&oq=

鎵€鏈夎繖浜涙暟鎹兘鍙互鐢ㄤ笂闈㈢殑鍑芥暟澶勭悊錛屾墍浠ヨ繖涓皬鍑芥暟鏄鍏峰疄鐢ㄤ環鍊肩殑銆?/p>

]]>
鏂囨湰澶勭悊(涓€)鐘舵€佹満(1)http://www.aygfsteel.com/shiliqiang/articles/286310.html鐭沖ご@鐭沖ご@Fri, 10 Jul 2009 11:37:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/286310.htmlhttp://www.aygfsteel.com/shiliqiang/comments/286310.htmlhttp://www.aygfsteel.com/shiliqiang/articles/286310.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/286310.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/286310.html緋葷粺紼嬪簭鍛樻垚闀胯鍒?鏂囨湰澶勭悊(涓€)

鐘舵€佹満(1)

o 鏈夌┓鐘舵€佹満鐨勫艦寮忓畾涔?/p>

鏈夌┓鐘舵€佹満鏄竴涓簲鍏冪粍 (Q錛?#931;錛?#948;錛宷0錛孎)錛屽叾涓細
Q鏄竴涓湁絀烽泦鍚堬紝縐頒負鐘舵€侀泦銆?br /> Σ鏄竴涓湁絀烽泦鍚堬紝縐頒負瀛楁瘝琛ㄣ€?br /> δ: Q xΣ飪燪縐頒負鐘舵€佽漿縐誨嚱鏁般€?br /> q0 鏄垵濮嬬姸鎬併€?br /> F 鏄帴鍙楃姸鎬侀泦銆?/p>

鏁欑涔︿笂鏄繖鏍峰畾涔夋湁絀瘋嚜鍔ㄦ満鐨勶紝榪欎釜褰㈠紡瀹氫箟綺劇‘鐨勬弿榪頒簡鏈夌┓鐘舵€佹満鐨勫惈涔夈€備絾鏄ぇ閮ㄥ垎浜?鍖呮嫭鎴戣嚜宸?絎竴嬈$湅鍒板畠鏃訛紝鍙嶅鐨勮涓婂嚑閬嶏紝浠嶇劧涓嶇煡閬撳畠鍦ㄨ浠€涔堛€傚垢濂介€氳繃涓€浜涘疄渚嬶紝鎴戜滑鍙互寰堝鏄撴槑鐧芥湁絀風姸鎬佹満鐨勫師鐞嗐€?/p>

鑷姩闂ㄦ槸涓€涓吀鍨嬬殑鏈夌┓鐘舵€佹満錛?/p>

瀹冩湁“寮€”鍜?#8220;鍏?#8221;涓ょ鐘舵€侊紝榪欏氨鏄畠鐨勭姸鎬侀泦錛屼篃灝辨槸涓婇潰鎵€璇寸殑Q銆?/p>

浜哄彲浠ヤ粠鑷姩闂ㄨ繘鏉ユ垨鍑哄幓錛屽綋浜鴻繘鏉ユ垨鍑哄幓鐨勬椂鍊欙紝鑷姩闂ㄤ細鑷姩鎵撳紑錛屽鏋滃湪瑙勫畾鐨勬椂闂村唴娌℃湁浜鴻繘鍑猴紝鑷姩闂ㄤ細鑷姩鍏充笂銆備漢鐨勮繘鏉ャ€佸嚭鍘誨拰瓚呮椂涓変釜浜嬩歡鏄嚜鍔ㄩ棬鐨勫瓧姣嶈〃錛屼篃灝辨槸涓婇潰鎵€璇寸殑Σ銆傝€岃嚜鍔ㄩ棬鍦ㄥ綋鍓嶇姸鎬佷笅錛屽浜嬩歡鐨勫搷搴旓紝浼氬紩璧風姸鎬佺殑鍙樺寲錛岃繖灝辨槸鐘舵€佽漿鎹㈠嚱鏁幫紝涔熷氨鏄笂闈㈡墍璇寸殑δ銆?/p>

鑷姩闂ㄥ垰瀹夎濂界殑鏃跺€欙紝鎴戜滑鍙互璁や負瀹冩槸鍏充笂鐨勶紝鎵€浠ュ叧闂姸鎬佹槸鑷姩闂ㄧ殑鍒濆鐘舵€併€?/p>

鍦ㄧ悊鎯蟲儏鍐典笅錛岃嚜鍔ㄩ棬浼氫竴鐩磋繍琛岋紝鎵€浠ュ畠娌℃湁鎺ュ彈鐘舵€侊紝鎺ュ彈鐘舵€侀泦F鏄┖闆嗐€?/p>

鏈夌┓鐘舵€佹満鐨勫艦寮忓畾涔夊緢綺劇‘錛屾枃瀛楁弿榪版瘮杈冮€氫織錛岃€屽浘褰㈣〃紺哄垯姣旇緝鐩磋銆傞€氱敤寤烘ā璇█錛圲ML錛夐噷鐨勭姸鎬佸浘鏄姸鎬佹満鐨勫父鐢ㄥ浘褰㈣〃紺烘柟娉曘€傜畝鍗曠殑鐘舵€佸浘鍖呮嫭涓€浜涚姸鎬侊紝鐢ㄥ渾瑙掓柟妗嗚〃紺猴紝閲岄潰鏈夌姸鎬佺殑鍚嶇О銆傜姸鎬佷箣闂寸殑杞崲錛岀敤綆ご琛ㄧず錛屼笂闈㈠彲浠ュ姞杞崲鏉′歡銆傝嚜鍔ㄩ棬鐨勭姸鎬佹満鍙互鐢ㄤ笅鍥捐〃紺猴細

鏈夌┓鐘舵€佹満寰堢畝鍗曪紝鍦ㄧ敓媧諱腑鍙互鎵懼嚭寰堝榪欐牱鐨勪緥瀛愩€備絾鏄暀縐戜功閲岃寰楀お澶嶆潅浜嗭紝涓€浼氬効璇佹槑紜畾鎬ф湁絀風姸鎬佹満鍜岄潪紜畾鎬ф湁絀風姸鎬佹満鐨勭瓑浠鋒€э紝涓€浼氬効璇佹槑姝e垯琛ㄨ揪寮忕殑姝e垯榪愮畻鏄皝闂殑錛屼竴浼氬効鍙堟潵涓車寮曠悊銆傝姳浜嗗緢闀挎椂闂達紝鎴戞墠鏄庣櫧榪欎簺鍘熺悊錛屼絾涓ゅ勾涔嬪悗錛屾垜鍙堟妸瀹冧滑蹇樺緱涓€騫蹭簩鍑€銆?/p>

涓昏鍘熷洜鏄伐浣滀腑娌℃湁鏈轟細榪愮敤瀹冧滑錛岃繖浜涚悊璁虹殑璇佹槑浜庣紪紼嬫病鏈夊お澶х敤澶勶紝涓嶈繃鐘舵€佹満鏈韓鍗存槸鏂囨湰澶勭悊鍒╁櫒錛岀敱浜庣▼搴忓憳鍦ㄥ緢澶氬満鍚堜笅閮芥槸鍦ㄤ笌鏂囨湰鏁版嵁鎵撲氦閬擄紝鎵€浠ョ姸鎬佹満鏄▼搴忓憳蹇呭鐨勫伐鍏蜂箣涓€銆傝繖閲屾垜浠皢涓€璧峰涔犲浣曠敤鐘舵€佹満鏉ュ鐞嗘枃鏈暟鎹紝鍚庨潰鎴戜滑涔熶細鎻愬埌鐘舵€佹満鐨勫叾瀹冪敤閫旓紝涓嶈繃涓嶆槸鏈妭鐨勯噸鐐廣€?br />


鏂囩珷鍑哄錛?a >http://www.limodev.cn/blog
浣滆€呰仈緋繪柟寮忥細鏉庡厛闈?<xianjimli at hotmail dot com>



]]>
鏂囨湰澶勭悊(浜?http://www.aygfsteel.com/shiliqiang/articles/286307.html鐭沖ご@鐭沖ご@Fri, 10 Jul 2009 11:03:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/286307.htmlhttp://www.aygfsteel.com/shiliqiang/comments/286307.htmlhttp://www.aygfsteel.com/shiliqiang/articles/286307.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/286307.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/286307.html
 

Builder妯″紡

鍓嶉潰鎴戜滑瀛︿範浜嗙姸鎬佹満錛屽茍鍒╃敤瀹冩潵瑙f瀽鍚勭鏍煎紡鐨勬枃鏈暟鎹€傝В鏋愯繃紼嬫妸綰挎€х殑鏂囨湰鏁版嵁杞崲鎴愪竴浜涘熀鏈殑閫昏緫鍗曞厓錛屼絾榪欓€氬父鍙槸浠誨姟鐨勪竴閮ㄥ垎錛屾帴涓嬫潵鎴戜滑榪樿瀵硅繖浜涜В鏋愬嚭鏉ョ殑鏁版嵁榪涗竴姝ュ鐞嗐€傚浜庣壒瀹氭牸寮忕殑鏂囨湰鏁版嵁錛屽畠鐨勮В鏋愯繃紼嬫槸涓€鏍風殑錛屼絾鏄瑙f瀽鍑烘潵鐨勬暟鎹殑澶勭悊鍗存槸澶氱澶氭牱鐨勩€備負浜嗚瑙f瀽榪囩▼鑳借閲嶇敤錛屽氨闇€瑕佹妸鏁版嵁鐨勮В鏋愬拰鏁版嵁鐨勫鐞嗗垎寮€銆?/p>

鐜板湪鎴戜滑鍥炶繃澶存潵鐪嬩竴涓嬪墠闈㈠啓鐨勫嚱鏁皃arse_token錛岃繖涓嚱鏁版妸鐢ㄥ垎闅旂鍒嗛殧鐨勬枃鏈暟鎹紝鍒嗙鍑轟竴涓竴涓殑token銆?/p>

parse_token鐨勫嚱鏁板師鍨嬪涓嬶細

typedef void (*OnTokenFunc)(void* ctx, int index, const char* token);
int parse_token(const char* text, const char* delims, OnTokenFunc on_token, void* ctx)

parse_token璐熻矗瑙f瀽鏁版嵁錛屼絾瀹冨茍涓嶅叧蹇冩暟鎹唬琛ㄧ殑鎰忎箟鍙婄敤閫斻€傚鏁版嵁鐨勮繘涓€姝ュ鐞嗙敱璋冪敤鑰呮彁渚涚殑鍥炶皟鍑芥暟鏉ュ畬鎴愶紝鍑芥暟 parse_token姣忚В鏋愬埌涓€涓猼oken錛屽氨璋冪敤榪欎釜鍥炶皟鍑芥暟銆俻arse_token璐熻矗鏁版嵁鐨勮В鏋愶紝鍥炶皟鍑芥暟璐熻矗鏁版嵁鐨勫鐞嗭紝榪欐牱涓€鏉ワ紝鏁版嵁鐨勮В鏋愬拰鏁版嵁鐨勫鐞嗗氨鍒嗗紑浜嗐€?/p>

parse_token鍙互璁や負鏄疊uilder妯″紡鏈€鏈寸礌鐨勫簲鐢ㄣ€傜幇鍦ㄦ垜浠湅鐪婤uilder 妯″紡錛?/p>

Builder 妯″紡鐨勬剰鍥撅細灝嗕竴涓鏉傚璞$殑鏋勫緩涓庡畠鐨勮〃紺哄垎紱伙紝浣垮緱鍚屾牱鐨勬瀯寤鴻繃紼嬪彲浠ュ垱寤轟笉鍚岀殑琛ㄧず銆?#8220;鏋勫緩”鍏跺疄灝辨槸鍓嶉潰鐨勮В鏋愯繃紼嬶紝鑰?#8220;琛ㄧず”灝辨槸鍓嶉潰璇寸殑瀵規暟鎹殑澶勭悊銆?/p>

瀵硅薄鍏崇郴錛?br /> 瀵硅薄鍏崇郴
涓婇潰鐨刾arse_token涓庤繖閲岀殑Director瀵瑰簲銆?/p>

涓婇潰鐨勫洖璋冨嚱鏁頒笌榪欓噷鐨凚uilder瀵瑰簲銆?/p>

鍏蜂綋鐨勫洖璋冨嚱鏁頒笌榪欓噷鐨凜oncreteBuilder瀵瑰簲銆?/p>

瀵規暟鎹鐞嗙殑緇撴灉灝辨槸Product銆?/p>

瀵硅薄鍗忎綔錛?br /> 瀵硅薄鍗忎綔
Client鏄痯arse_token鐨勮皟鐢ㄨ€呫€?/p>

鐢變簬parse_token鏄寜闈㈠悜榪囩▼鐨勬柟寮忚璁$殑錛屾墍浠oncreteBuilder鍜孌irector鐨勫垱寤哄彧鏄搴斾簬涓€浜涘垵濮嬪寲浠g爜銆?/p>

璋冪敤parse_token鐩稿綋浜庤皟鐢╝Director鐨凜onstruct鍑芥暟銆?/p>

璋冪敤鍥炶皟鍑芥暟鐩稿綋浜庤皟鐢╝ConcreteBuilder鐨凚uildPart鍑芥暟銆?/p>

鍥炶皟鍑芥暟鍙兘鎶婂鐞嗙粨鏋滃瓨鍦ㄥ畠鐨勫弬鏁癱tx涓紝GetResult鏄粠閲岄潰鑾峰彇緇撴灉錛岃繖鏄彲閫夌殑榪囩▼錛屼緷璧栦簬鍏蜂綋鍥炶皟鍑芥暟鎵€鍋氱殑宸ヤ綔銆?/p>

parse_token鐨勪緥瀛愮畝鍗曠洿鎺ワ紝瀵逛簬鐞嗚ВBuilder妯″紡鏈夎緝澶х殑甯姪錛屼笉榪囨瘯绔熷畠鏄潰鍚戣繃紼嬬殑銆傜幇鍦ㄦ垜浠互鍓嶉潰鐨刋ML瑙f瀽鍣ㄤ負渚嬫潵璇存槑Builder妯″紡錛岃櫧鐒舵垜浠殑浠g爜鏄敤C鍐欑殑錛屼絾瀹屽叏鏄敤闈㈠悜瀵硅薄鐨勬€濇兂鏉ヨ璁$殑銆侭uilder鏄竴涓帴鍙o紝鎴戜滑鍏堟妸瀹冨畾涔夊嚭鏉ワ細

struct _XmlBuilder;
typedef struct _XmlBuilder XmlBuilder;

typedef void (*XmlBuilderOnStartElementFunc)(XmlBuilder* thiz, const char* tag, const char** attrs);
typedef void (*XmlBuilderOnEndElementFunc)(XmlBuilder* thiz, const char* tag);
typedef void (*XmlBuilderOnTextFunc)(XmlBuilder* thiz, const char* text, size_t length);
typedef void (*XmlBuilderOnCommentFunc)(XmlBuilder* thiz, const char* text, size_t length);
typedef void (*XmlBuilderOnPiElementFunc)(XmlBuilder* thiz, const char* tag, const char** attrs);
typedef void (*XmlBuilderOnErrorFunc)(XmlBuilder* thiz, int line, int row, const char* message);
typedef void (*XmlBuilderDestroyFunc)(XmlBuilder* thiz);

struct _XmlBuilder
{
XmlBuilderOnStartElementFunc on_start_element;
XmlBuilderOnEndElementFunc on_end_element;
XmlBuilderOnTextFunc on_text;
XmlBuilderOnCommentFunc on_comment;
XmlBuilderOnPiElementFunc on_pi_element;
XmlBuilderOnErrorFunc on_error;
XmlBuilderDestroyFunc destroy;

char priv[1];
};

static inline void xml_builder_on_start_element(XmlBuilder* thiz, const char* tag, const char** attrs)

{

return_if_fail(thiz != NULL && thiz->on_start_element != NULL);

thiz->on_start_element(thiz, tag, attrs);

return;

}

static inline void xml_builder_on_end_element(XmlBuilder* thiz, const char* tag)

{

return_if_fail(thiz != NULL && thiz->on_end_element != NULL);

thiz->on_end_element(thiz, tag);

return;

}

...
(鍏跺畠inline鍑芥暟涓嶅垪鍦ㄨ繖閲屼簡)

XmlBuilder鎺ュ彛瑕佹眰瀹炵幇涓嬪垪鍑芥暟錛?/p>

on_start_element錛氳В鏋愬櫒瑙f瀽鍒頒竴涓搗濮婽AG鏃惰皟鐢ㄥ畠銆?br /> on_end_element錛氳В鏋愬櫒瑙f瀽鍒頒竴涓粨鏉烼AG鏃惰皟鐢ㄥ畠銆?br /> on_text錛氳В鏋愬櫒瑙f瀽鍒頒竴孌墊枃鏈椂璋冪敤瀹冦€?br /> on_comment錛氳В鏋愬櫒瑙f瀽鍒頒竴涓敞閲婃椂璋冪敤瀹冦€?br /> on_pi_element錛氳В鏋愬櫒瑙f瀽鍒頒竴涓鐞嗘寚浠ゆ椂璋冪敤瀹冦€?br /> on_error錛氳В鏋愬櫒閬囧埌閿欒鏃惰皟鐢ㄥ畠銆?br /> destroy錛氱敤閿€姣丅uilder瀵硅薄銆?/p>

on_start_element鍜宱n_end_element絳夊嚱鏁扮浉褰撲簬Builder妯″紡涓殑BuildPartX鍑芥暟銆?/p>

XML瑙f瀽鍣ㄧ浉褰撲簬Director錛屽湪鍓嶉潰鎴戜滑宸茬粡鍐欏ソ浜嗭紝涓嶈繃瀹冨瑙f瀽鍑烘潵鐨勬暟鎹病鏈夊仛浠諱綍澶勭悊銆傜幇鍦ㄦ垜浠瀹冨仛浜涗慨鏀癸紝璁╁畠璋冪敤XmlBuilder鐨勫嚱鏁般€?/p>

XML瑙f瀽鍣ㄥ澶栨彁渚涗笅闈㈠嚑涓嚱鏁幫細

o 鏋勯€犲嚱鏁般€?/p>

XmlParser* xml_parser_create(void);

o 涓簒mlParser璁劇疆builder瀵硅薄銆?/p>

void       xml_parser_set_builder(XmlParser* thiz, XmlBuilder* builder);

o 瑙f瀽XML

void       xml_parser_parse(XmlParser* thiz, const char* xml);

o 鏋愭瀯鍑芥暟

void       xml_parser_destroy(XmlParser* thiz);

鍦ㄨВ鏋愭椂錛岃В鏋愬埌鐩稿簲鐨則ag錛屽氨璋冪敤XmlBuilder鐩稿簲鐨勫嚱鏁幫細

o 瑙f瀽鍒拌搗濮媡ag鏃惰皟鐢▁ml_builder_on_start_element

static void xml_parser_parse_start_tag(XmlParser* thiz)
{
enum _State
{
STAT_NAME,
STAT_ATTR,
STAT_END,
}state = STAT_NAME;

char* tag_name = NULL;
const char* start = thiz->read_ptr - 1;

for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_NAME:
{
if(isspace(c) || c == '>' || c == '/')
{
tag_name = (char*)xml_parser_strdup(thiz, start, thiz->read_ptr - start);
state = (c != '>' && c != '/') ? STAT_ATTR : STAT_END;
}
break;
}
case STAT_ATTR:
{
xml_parser_parse_attrs(thiz, '/');
state = STAT_END;

break;
}
default:break;
}

if(state == STAT_END)
{
break;
}
}

tag_name = thiz->buffer + (size_t)tag_name;
/*瑙f瀽瀹屾垚錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_start_element銆?/
xml_builder_on_start_element(thiz->builder, tag_name, (const char**)thiz->attrs);

if(thiz->read_ptr[0] == '/')
{
/*濡傛灉tag浠?/'緇撴潫錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_end_element銆?/
xml_builder_on_end_element(thiz->builder, tag_name);
}

for(; *thiz->read_ptr != '>' && *thiz->read_ptr != '\0'; thiz->read_ptr++);

return;
}

o 瑙f瀽鍒扮粨鏉焧ag鏃惰皟鐢▁ml_builder_on_end_element

static void xml_parser_parse_end_tag(XmlParser* thiz)
{
char* tag_name = NULL;
const char* start = thiz->read_ptr;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
if(*thiz->read_ptr == '>')
{
tag_name = thiz->buffer + xml_parser_strdup(thiz, start, thiz->read_ptr-start);
/*瑙f瀽瀹屾垚錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_end_element銆?/
xml_builder_on_end_element(thiz->builder, tag_name);

break;
}
}

return;
}

o 瑙f瀽鍒版枃鏈椂璋冪敤xml_builder_on_text

static void xml_parser_parse_text(XmlParser* thiz)
{
const char* start = thiz->read_ptr - 1;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

if(c == '<')
{
if(thiz->read_ptr > start)
{
/*瑙f瀽瀹屾垚錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_text銆?/
xml_builder_on_text(thiz->builder, start, thiz->read_ptr-start);
}
thiz->read_ptr--;
return;
}
else if(c == '&')
{
xml_parser_parse_entity(thiz);
}
}

return;
}

o 瑙f瀽鍒版敞閲婃椂璋冪敤xml_builder_on_comment

static void xml_parser_parse_comment(XmlParser* thiz)
{
enum _State
{
STAT_COMMENT,
STAT_MINUS1,
STAT_MINUS2,
}state = STAT_COMMENT;

const char* start = ++thiz->read_ptr;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_COMMENT:
{
if(c == '-')
{
state = STAT_MINUS1;
}
break;
}
case STAT_MINUS1:
{
if(c == '-')
{
state = STAT_MINUS2;
}
else
{
state = STAT_COMMENT;
}
break;
}
case STAT_MINUS2:
{
if(c == '>')
{
/*瑙f瀽瀹屾垚錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_comment銆?/
xml_builder_on_comment(thiz->builder, start, thiz->read_ptr-start-2);
return;
}
}
default:break;
}
}

return;
}

o 瑙f瀽鍒板鐞嗘寚浠ゆ椂璋冪敤xml_builder_on_pi_element

static void xml_parser_parse_pi(XmlParser* thiz)
{
enum _State
{
STAT_NAME,
STAT_ATTR,
STAT_END
}state = STAT_NAME;

char* tag_name = NULL;
const char* start = thiz->read_ptr;

for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_NAME:
{
if(isspace(c) || c == '>')
{
tag_name = (char*)xml_parser_strdup(thiz, start, thiz->read_ptr - start);
state = c != '>' ? STAT_ATTR : STAT_END;
}

break;
}
case STAT_ATTR:
{
xml_parser_parse_attrs(thiz, '?');
state = STAT_END;
break;
}
default:break;
}

if(state == STAT_END)
{
break;
}
}

tag_name = thiz->buffer + (size_t)tag_name;
/*瑙f瀽瀹屾垚錛岃皟鐢╞uilder鐨勫嚱鏁皒ml_builder_on_pi_element銆?/
xml_builder_on_pi_element(thiz->builder, tag_name, (const char**)thiz->attrs);

for(; *thiz->read_ptr != '>' && *thiz->read_ptr != '\0'; thiz->read_ptr++);

return;
}

浠庝笂闈㈢殑浠g爜鍙互鐪嬪嚭錛孹mlParser鍦ㄩ€傚綋鐨勬椂鍊欒皟鐢ㄤ簡XmlBuilder鐨勬帴鍙e嚱鏁幫紝鑷充簬XmlBuilder鍦ㄨ繖浜涘嚱鏁伴噷鍋氫粈涔堬紝瑕佺湅鍏蜂綋鐨凚uilder瀹炵幇浜嗐€?/p>

鍏堢湅涓€涓渶綆€鍗曠殑XmlBuilder瀹炵幇錛屽畠鍙槸鍦ㄥ睆騫曚笂鎵撳嵃鍑轟紶閫掔粰瀹冪殑鏁版嵁錛?/p>

o 鍒涘緩鍑芥暟

XmlBuilder* xml_builder_dump_create(FILE* fp)
{
XmlBuilder* thiz = (XmlBuilder*)calloc(1, sizeof(XmlBuilder));

if(thiz != NULL)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;

thiz->on_start_element = xml_builder_dump_on_start_element;
thiz->on_end_element = xml_builder_dump_on_end_element;
thiz->on_text = xml_builder_dump_on_text;
thiz->on_comment = xml_builder_dump_on_comment;
thiz->on_pi_element = xml_builder_dump_on_pi_element;
thiz->on_error = xml_builder_dump_on_error;
thiz->destroy = xml_builder_dump_destroy;

priv->fp = fp != NULL ? fp : stdout;
}

return thiz;
}

鍜屽叾瀹冩帴鍙g殑鍒涘緩鍑芥暟涓€鏍鳳紝瀹冨彧鏄妸鎺ュ彛瑕佹眰鐨勫嚱鏁版寚閽堟寚鍒板叿浣撶殑瀹炵幇鍑芥暟涓娿€?/p>

o 瀹炵幇 on_start_element

static void xml_builder_dump_on_start_element(XmlBuilder* thiz, const char* tag, const char** attrs)
{
int i = 0;
PrivInfo* priv = (PrivInfo*)thiz->priv;
fprintf(priv->fp, "<%s", tag);

for(i = 0; attrs != NULL && attrs[i] != NULL && attrs[i + 1] != NULL; i += 2)
{
fprintf(priv->fp, " %s=\"%s\"", attrs[i], attrs[i + 1]);
}
fprintf(priv->fp, ">");

return;
}

o 瀹炵幇on_end_element

static void xml_builder_dump_on_end_element(XmlBuilder* thiz, const char* tag)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;
fprintf(priv->fp, "\n", tag);

return;
}

o 瀹炵幇on_text

static void xml_builder_dump_on_text(XmlBuilder* thiz, const char* text, size_t length)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;
fwrite(text, length, 1, priv->fp);

return;
}

o 瀹炵幇on_comment

static void xml_builder_dump_on_comment(XmlBuilder* thiz, const char* text, size_t length)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;
fprintf(priv->fp, "\n");

return;
}

o 瀹炵幇on_pi_element

static void xml_builder_dump_on_pi_element(XmlBuilder* thiz, const char* tag, const char** attrs)
{
int i = 0;
PrivInfo* priv = (PrivInfo*)thiz->priv;
fprintf(priv->fp, "fp, " %s=\"%s\"", attrs[i], attrs[i + 1]);
}
fprintf(priv->fp, "?>\n");

return;
}

o 瀹炵幇on_error

static void xml_builder_dump_on_error(XmlBuilder* thiz, int line, int row, const char* message)
{
fprintf(stderr, "(%d,%d) %s\n", line, row, message);

return;
}

涓婇潰鐨刋mlBuilder瀹炵幇綆€鍗曪紝鑰屼笖鏈変竴瀹氱殑瀹炵敤浠峰€鹼紝鎴戜竴鑸兘浼氬厛鍐欒繖鏍蜂竴涓狟uilder銆傚畠涓嶄絾瀵逛簬璋冭瘯紼嬪簭鏈変笉灝忕殑甯姪錛岃€屼笖鍙紼嶅仛淇敼錛屽氨鍙互鎶婂畠鏀硅繘鎴愪竴涓編鍖栨暟鎹牸寮忕殑灝忓伐鍏鳳紝涓嶇鍘熷鏁版嵁鐨勬牸寮?褰撶劧瑕佸悎絎︾浉搴旂殑璇硶瑙勫垯)鏈夊涔憋紝浣犻兘鑳戒互涓€縐嶆瘮杈冨ソ鐪嬬殑鏂瑰紡鎵撳嵃鍑烘潵銆?/p>

涓嬮潰鎴戜滑鍐嶇湅涓€涓瘮杈冨鏉傜殑XmlBuilder鐨勫疄鐜幫紝瀹冩牴鎹帴鏀剁殑鏁版嵁鏋勫緩涓€媯礨ML鏍戙€?/p>

o 鍒涘緩鍑芥暟

XmlBuilder* xml_builder_tree_create(void)
{
XmlBuilder* thiz = (XmlBuilder*)calloc(1, sizeof(XmlBuilder));

if(thiz != NULL)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;

thiz->on_start_element = xml_builder_tree_on_start_element;
thiz->on_end_element = xml_builder_tree_on_end_element;
thiz->on_text = xml_builder_tree_on_text;
thiz->on_comment = xml_builder_tree_on_comment;
thiz->on_pi_element = xml_builder_tree_on_pi_element;
thiz->on_error = xml_builder_tree_on_error;
thiz->destroy = xml_builder_tree_destroy;

priv->root = xml_node_create_normal("__root__", NULL);
priv->current = priv->root;
}

return thiz;
}

鍜屽叾瀹冩帴鍙g殑鍒涘緩鍑芥暟涓€鏍鳳紝瀹冨彧鏄妸鎺ュ彛瑕佹眰鐨勫嚱鏁版寚閽堟寚鍒板叿浣撶殑瀹炵幇鍑芥暟涓娿€傝繖閲岃繕鍒涘緩浜嗕竴涓牴緇撶偣__root__錛屼互淇濊瘉鏁存5鏍戝彧鏈変竴涓牴緇撶偣銆?/p>

o 瀹炵幇 on_start_element

static void xml_builder_tree_on_start_element(XmlBuilder* thiz, const char* tag, const char** attrs)
{
XmlNode* new_node = NULL;
PrivInfo* priv = (PrivInfo*)thiz->priv;

new_node = xml_node_create_normal(tag, attrs);
xml_node_append_child(priv->current, new_node);
priv->current = new_node;

return;
}

榪欓噷鍒涘緩浜嗕竴涓柊鐨勭粨鐐癸紝騫惰拷鍔犱負priv->current鐨勫瓙緇撶偣錛岀劧鍚庤priv->current鎸囧悜鏂扮殑緇撶偣銆?/p>

o 瀹炵幇 on_end_element

static void xml_builder_tree_on_end_element(XmlBuilder* thiz, const char* tag)
{
PrivInfo* priv = (PrivInfo*)thiz->priv;
priv->current = priv->current->parent;
assert(priv->current != NULL);

return;
}

榪欓噷鍙槸璁﹑riv->current鎸囧悜瀹冪殑鐖剁粨鐐廣€?/p>

o 瀹炵幇 on_text

static void xml_builder_tree_on_text(XmlBuilder* thiz, const char* text, size_t length)
{
XmlNode* new_node = NULL;
PrivInfo* priv = (PrivInfo*)thiz->priv;

new_node = xml_node_create_text(text);
xml_node_append_child(priv->current, new_node);

return;
}

榪欓噷鍒涘緩涓€涓枃鏈粨鐐癸紝 騫惰拷鍔犱負priv->current鐨勫瓙緇撶偣銆?/p>

o 瀹炵幇 on_comment

static void xml_builder_tree_on_comment(XmlBuilder* thiz, const char* text, size_t length)
{
XmlNode* new_node = NULL;
PrivInfo* priv = (PrivInfo*)thiz->priv;

new_node = xml_node_create_comment(text);
xml_node_append_child(priv->current, new_node);

return;
}

榪欓噷鍒涘緩涓€涓敞閲婄粨鐐癸紝 騫惰拷鍔犱負priv->current鐨勫瓙緇撶偣銆?/p>

o 瀹炵幇 on_pi_element

static void xml_builder_tree_on_pi_element(XmlBuilder* thiz, const char* tag, const char** attrs)
{
XmlNode* new_node = NULL;
PrivInfo* priv = (PrivInfo*)thiz->priv;

new_node = xml_node_create_pi(tag, attrs);
xml_node_append_child(priv->current, new_node);

return;
}

榪欓噷鍒涘緩涓€涓鐞嗘寚浠ょ粨鐐癸紝 騫惰拷鍔犱負priv->current鐨勫瓙緇撶偣銆?/p>

o 瀹炵幇on_error

static void xml_builder_tree_on_error(XmlBuilder* thiz, int line, int row, const char* message)
{
fprintf(stderr, "(%d,%d) %s\n", line, row, message);

return;
}

涓嬮潰鎴戜滑鍐嶇湅XmlNode鐨勬暟鎹粨鏋勫拰涓昏鍑芥暟錛?/p>

o 鏁版嵁緇撴瀯

typedef struct _XmlNode
{
XmlNodeType type;
union
{
char* text;
char* comment;
XmlNodePi pi;
XmlNodeNormal normal;
}u;
struct _XmlNode* parent;
struct _XmlNode* children;
struct _XmlNode* sibling;
}XmlNode;

type鍐沖畾浜嗙粨鐐圭殑綾誨瀷錛屽彲浠ユ槸澶勭悊鎸囦護(XML_NODE_PI)銆佹枃鏈?XML_NODE_TEXT)銆佹敞閲?XML_NODE_COMMENT)鎴栨櫘閫歍AG(XML_NODE_NORMAL)銆?/p>

鑱斿悎浣撶敤浜庡瓨鏀懼叿浣撶粨鐐逛俊鎭€?/p>

parent鎸囧悜鐖剁粨鐐廣€?/p>

children鎸囧悜絎竴涓瓙緇撶偣銆?/p>

sibling鎸囧悜涓嬩竴涓厔寮熺粨鐐廣€?/p>

o 鍒涘緩鏅€歍AG緇撶偣

XmlNode* xml_node_create_normal(const char* name, const char** attrs)
{
XmlNode* node = NULL;
return_val_if_fail(name != NULL, NULL);

if((node = calloc(1, sizeof(XmlNode))) != NULL)
{
int i = 0;
node->type = XML_NODE_NORMAL;
node->u.normal.name = strdup(name);

if(attrs != NULL)
{
for(i = 0; attrs[i] != NULL && attrs[i+1] != NULL; i += 2)
{
xml_node_append_attr(node, attrs[i], attrs[i+1]);
}
}
}

return node;
}

o 鍒涘緩澶勭悊鎸囦護緇撶偣

XmlNode* xml_node_create_pi(const char* name, const char** attrs)
{
XmlNode* node = NULL;
return_val_if_fail(name != NULL, NULL);

if((node = calloc(1, sizeof(XmlNode))) != NULL)
{
int i = 0;
node->type = XML_NODE_PI;
node->u.pi.name = strdup(name);
if(attrs != NULL)
{
for(i = 0; attrs[i] != NULL && attrs[i+1] != NULL; i += 2)
{
xml_node_append_attr(node, attrs[i], attrs[i+1]);
}
}
}

return node;
}

o 鍒涘緩鏂囨湰緇撶偣

XmlNode* xml_node_create_text(const char* text)
{
XmlNode* node = NULL;
return_val_if_fail(text != NULL, NULL);

if((node = calloc(1, sizeof(XmlNode))) != NULL)
{
node->type = XML_NODE_TEXT;
node->u.text = strdup(text);
}

return node;
}

o 鍒涘緩娉ㄩ噴緇撶偣

XmlNode* xml_node_create_comment(const char* comment)
{
XmlNode* node = NULL;
return_val_if_fail(comment != NULL, NULL);

if((node = calloc(1, sizeof(XmlNode))) != NULL)
{
node->type = XML_NODE_COMMENT;
node->u.comment = strdup(comment);
}

return node;
}

o 榪藉姞涓€涓厔寮熺粨鐐?/p>

XmlNode* xml_node_append_sibling(XmlNode* node, XmlNode* sibling)
{
return_val_if_fail(node != NULL && sibling != NULL, NULL);

if(node->sibling == NULL)
{
/*娌℃湁鍏勫紵緇撶偣錛岃鍏勫紵緇撶偣鎸囧悜sibling */
node->sibling = sibling;
}
else
{
/*鍚﹀垯錛屾妸sibling榪藉姞涓烘渶鍚庝竴涓厔寮熺粨鐐?/
XmlNode* iter = node->sibling;
while(iter->sibling != NULL) iter = iter->sibling;
iter->sibling = sibling;
}
/*璁╁厔寮熺粨鐐圭殑鐖剁粨鐐規寚鍚戣嚜宸辯殑鐖剁粨鐐?/

sibling->parent = node->parent;

return sibling;
}

o 榪藉姞涓€涓瓙緇撶偣

XmlNode* xml_node_append_child(XmlNode* node, XmlNode* child)
{
return_val_if_fail(node != NULL && child != NULL, NULL);

if(node->children == NULL)
{
/*娌℃湁瀛愮粨鐐癸紝璁╁瓙緇撶偣鎸囧悜child */
node->children = child;
}
else
{
/*鍚﹀垯錛屾妸child 榪藉姞涓烘渶鍚庝竴涓瓙緇撶偣*/
XmlNode* iter = node->children;
while(iter->sibling != NULL) iter = iter->sibling;
iter->sibling = child;
}
/*璁╁瓙緇撶偣鐨勭埗緇撶偣鎸囧悜鑷繁*/

child->parent = node;

return child;
}

鍥炲ご鍐嶇湅涓€涓媂mlParser錛孹mlBuilder鍙婂嚑涓叿浣撶殑XmlBuilder鐨勫疄鐜幫紝鎴戜滑鍙互鐪嬪埌錛屽畠浠殑瀹炵幇閮介潪甯哥畝鍗曪紝鍏跺疄榪欏畬鍏ㄥ緱鐩婁簬Builder妯″紡鐨勮璁℃柟娉曘€傚畠鍒╃敤鍒嗚€屾不涔嬬殑鎬濇兂錛屾妸鏁版嵁鐨勮В鏋愬拰鏁版嵁鐨勫鐞嗗垎寮€錛岄檷浣庝簡瀹炵幇鐨勫鏉傚害銆傚叾嬈″畠鍒╃敤浜嗘娊璞$殑鎬濇兂錛屼粠鑰屾暟鎹殑瑙f瀽鍙叧蹇冨鐞嗘暟鎹鐞嗙殑鎺ュ彛錛岃€屼笉鍏沖績鐨勫畠鐨勫疄鐜幫紝浣垮緱鏁版嵁瑙f瀽鍜屾暟鎹鐞嗗彲浠ョ嫭绔嬪彉鍖栥€?/p>

鍒嗚€屾不涔嬪拰鎶借薄鏄檷浣庡鏉傚害鏈€鏈夋晥鐨勬墜孌典箣涓€錛屽畠浠湪Builder妯″紡閲屽緱鍒頒簡寰堝ソ鐨勪綋鐜般€傚垵瀛﹁€呭簲璇ュ鑺變簺鏃墮棿鍘諱綋浼氥€?br />

鏂囩珷鍑哄錛?a >http://www.limodev.cn/blog
浣滆€呰仈緋繪柟寮忥細鏉庡厛闈?<xianjimli at hotmail dot com>



]]>
鏂囨湰澶勭悊(涓€)http://www.aygfsteel.com/shiliqiang/articles/286306.html鐭沖ご@鐭沖ご@Fri, 10 Jul 2009 10:57:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/286306.htmlhttp://www.aygfsteel.com/shiliqiang/comments/286306.htmlhttp://www.aygfsteel.com/shiliqiang/articles/286306.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/286306.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/286306.html鏂囩珷鍑哄錛?a >http://www.limodev.cn/blog
浣滆€呰仈緋繪柟寮忥細鏉庡厛闈?<xianjimli at hotmail dot com>

緋葷粺紼嬪簭鍛樻垚闀胯鍒?鏂囨湰澶勭悊(涓€)

鐘舵€佹満(4)

XML瑙f瀽鍣?/p>

XML錛圗xtensible Markup Language錛夊嵆鍙墿灞曟爣璁拌璦€錛屼篃鏄竴縐嶅父鐢ㄧ殑鏁版嵁鏂囦歡鏍煎紡銆傜浉瀵逛簬INI鏉ヨ錛屽畠瑕佸鏉傚緱澶氾紝INI鍙兘淇濆瓨綰挎€х粨鏋勭殑鏁版嵁錛岃€孹ML鍙互淇濆瓨鏍戝艦緇撴瀯鐨勬暟鎹€傚厛鐪嬩笅闈㈢殑渚嬪瓙錛?/p>

<?xml version="1.0" encoding="utf-8"?>
<mime-type xmlns="http://www.freedesktop.org/standards/shared-mime-info" type="all/all">
<!--Created automatically by update-mime-database. DO NOT EDIT!-->
<comment>all files and folders</comment>
</mime-type>

絎竴琛岀О涓哄鐞嗘寚浠?PI)錛屾槸緇欒В鏋愬櫒鐢ㄧ殑銆傝繖閲屽憡璇夎В鏋愬櫒錛屽綋鍓嶇殑XML鏂囦歡閬靛驚XML 1.0瑙勮寖錛屾枃浠跺唴瀹圭敤UTF-8緙栫爜銆?/p>

絎簩琛屾槸涓€涓搗濮婽AG錛孴AG鐨勫悕縐頒負mime-type銆傚畠鏈変袱涓睘鎬э紝絎竴涓睘鎬х殑鍚嶇О涓簒mlns錛屽€間負 http://www.freedesktop.org/standards/shared-mime-info銆傜浜屼釜灞炴€х殑鍚嶇О涓簍ype錛屽€間負 all/all銆?/p>

絎笁琛屾槸涓€涓敞閲娿€?/p>

絎洓琛屽寘鎷竴涓搗濮婽AG錛屼竴孌墊枃鏈拰緇撴潫TAG銆?/p>

絎簲琛屾槸涓€涓粨鏉烼AG銆?/p>

XML鏈韓鐨勬牸寮忎笉鏄湰鏂囩殑閲嶇偣錛屾垜浠笉璇︾粏璁ㄨ浜嗐€傝繖閲岀殑閲嶇偣鏄浣曠敤鐘舵€佹満瑙f瀽鏍煎紡澶嶆潅鐨勬暟鎹€?/p>

鎸夌収鍓嶉潰鐨勬柟娉曪紝鍏堟妸鏁版嵁璇誨叆鍒頒竴涓紦鍐插尯涓紝璁╀竴涓寚閽堟寚鍚戠紦鍐插尯鐨勫ご閮紝鐒跺悗縐誨姩鎸囬拡錛岀洿鍒版寚鍚戠紦鍐插尯鐨勫熬閮ㄣ€傚湪榪欎釜榪囩▼涓紝鎸囬拡鍙兘鎸囧悜錛氳搗濮婽AG錛岀粨鏉烼AG錛屾敞閲婏紝澶勭悊鎸囦護鍜屾枃鏈€傜敱姝ゆ垜浠畾涔夊嚭鐘舵€佹満鐨勪富瑕佺姸鎬侊細

1. 璧峰TAG鐘舵€?br /> 2. 緇撴潫TAG鐘舵€?br /> 3. 娉ㄩ噴鐘舵€?br /> 4. 澶勭悊鎸囦護鐘舵€?br /> 5. 鏂囨湰鐘舵€?/p>

鐢變簬璧峰TAG銆佺粨鏉烼AG銆佹敞閲婂拰澶勭悊鎸囦護閮藉湪瀛楃‘<’鍜?#8216;>’涔嬮棿錛屾墍浠ュ綋璇誨叆瀛楃‘<’鏃訛紝鎴戜滑榪樻棤娉曠煡閬撳綋鍓嶇殑鐘舵€侊紝涓轟簡渚夸簬澶勭悊錛屾垜浠紩鍏ヤ竴涓腑闂寸姸鎬侊紝縐頒負“灝忎簬鍙蜂箣鍚?#8221;鐨勭姸鎬併€傚湪璇誨叆瀛楃‘<’鍜?#8216;!’涔嬪悗錛岃繕瑕佽鍏ヤ袱涓?#8216;-’錛屾墠鑳界‘瀹氳繘鍏ユ敞閲婄姸鎬侊紝涓轟簡渚夸簬澶勭悊錛屽啀寮曞叆涓や釜涓棿鐘舵€?#8220;娉ㄩ噴鍓嶄竴”鍜?#8220;娉ㄩ噴鍓嶄簩”銆傚啀寮曞叆涓€涓?#8220;絀?#8221;鐘舵€侊紝琛ㄧず涓嶅湪涓婅堪浠諱綍鐘舵€佷腑銆?/p>

鐘舵€佽漿鎹㈠嚱鏁幫細
1. 鍦?#8220;絀?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;<’錛岃繘鍏?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€併€?br /> 2. 鍦?#8220;絀?#8221;鐘舵€佷笅錛岃鍏ラ潪‘<’闈炵┖鐧界殑瀛楃錛岃繘鍏?#8220;鏂囨湰”鐘舵€併€?br /> 3. 鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;錛?#8217;錛岃繘鍏?#8220;娉ㄩ噴鍓嶄竴” 鐘舵€併€?br /> 4. 鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;?’錛岃繘鍏?#8220;澶勭悊鎸囦護”鐘舵€併€?br /> 5. 鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’錛岃繘鍏?#8220;緇撴潫TAG”鐘舵€併€?br /> 6. 鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ユ湁鏁堢殑ID瀛楃錛岃繘鍏?#8220;璧峰TAG”鐘舵€併€?br /> 7. 鍦?#8220;娉ㄩ噴鍓嶄竴” 鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;-’錛?榪涘叆“娉ㄩ噴鍓嶄簩” 鐘舵€併€?br /> 8. 鍦?#8220;娉ㄩ噴鍓嶄簩” 鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;-’錛?榪涘叆“娉ㄩ噴” 鐘舵€併€?br /> 9. 鍦?“璧峰TAG” 鐘舵€併€?#8220;緇撴潫TAG” 鐘舵€?銆?#8220;鏂囨湰” 鐘舵€併€?#8220;娉ㄩ噴”鐘舵€?鍜?#8220;澶勭悊鎸囦護”鐘舵€佺粨鏉熷悗錛岄噸鏂板洖鍒?#8220;絀?#8221;鐘舵€佷笅銆?/p>

榪欎釜鐘舵€佹満鐨勫浘褰㈣〃紺哄涓嬶細

涓嬮潰鎴戜滑鏉ョ湅鐪嬩唬鐮佸疄鐜幫細

void xml_parser_parse(XmlParser* thiz, const char* xml)
{
/*瀹氫箟鐘舵€佺殑鏋氫婦鍊?/
enum _State
{
STAT_NONE,
STAT_AFTER_LT,
STAT_START_TAG,
STAT_END_TAG,
STAT_TEXT,
STAT_PRE_COMMENT1,
STAT_PRE_COMMENT2,
STAT_COMMENT,
STAT_PROCESS_INSTRUCTION,
}state = STAT_NONE;

thiz->read_ptr = xml;
/*鎸囬拡浠庡ご縐誨姩鍒板熬*/
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = thiz->read_ptr[0];

switch(state)
{
case STAT_NONE:
{
if(c == '<')
{
/*鍦?#8220;絀?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;<’錛岃繘鍏?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€併€?/
xml_parser_reset_buffer(thiz);
state = STAT_AFTER_LT;
}
else if(!isspace(c))
{
/*鍦?#8220;絀?#8221;鐘舵€佷笅錛岃鍏ラ潪‘<’闈炵┖鐧界殑瀛楃錛岃繘鍏?#8220;鏂囨湰”鐘舵€併€?/
state = STAT_TEXT;
}
break;
}
case STAT_AFTER_LT:
{
if(c == '?')
{
/*鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;?’錛岃繘鍏?#8220;澶勭悊鎸囦護”鐘舵€併€?/
state = STAT_PROCESS_INSTRUCTION;
}
else if(c == '/')
{
/*鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’錛岃繘鍏?#8220;緇撴潫TAG”鐘舵€併€?/
state = STAT_END_TAG;
}
else if(c == '!')
{
/*鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;錛?#8217;錛岃繘鍏?#8220;娉ㄩ噴鍓嶄竴” 鐘舵€?/
state = STAT_PRE_COMMENT1;
}
else if(isalpha(c) || c == '_')
{
/*鍦?#8220;灝忎簬鍙蜂箣鍚?#8221;鐘舵€佷笅錛岃鍏ユ湁鏁堢殑ID瀛楃錛岃繘鍏?#8220;璧峰TAG”鐘舵€併€?/
state = STAT_START_TAG;
}
else
{
}
break;
}
case STAT_START_TAG:
{
/*榪涘叆瀛愮姸鎬?/
xml_parser_parse_start_tag(thiz);
state = STAT_NONE;
break;
}
case STAT_END_TAG:
{
/*榪涘叆瀛愮姸鎬?/
xml_parser_parse_end_tag(thiz);
state = STAT_NONE;
break;
}
case STAT_PROCESS_INSTRUCTION:
{
/*榪涘叆瀛愮姸鎬?/
xml_parser_parse_pi(thiz);
state = STAT_NONE;
break;
}
case STAT_TEXT:
{
/*榪涘叆瀛愮姸鎬?/
xml_parser_parse_text(thiz);
state = STAT_NONE;
break;
}
case STAT_PRE_COMMENT1:
{
if(c == '-')
{
/*鍦?#8220;娉ㄩ噴鍓嶄竴” 鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;-’錛?榪涘叆“娉ㄩ噴鍓嶄簩” 鐘舵€併€?/
state = STAT_PRE_COMMENT2;
}
else
{
}
break;
}
case STAT_PRE_COMMENT2:
{
if(c == '-')
{
/*鍦?#8220;娉ㄩ噴鍓嶄簩” 鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;-’錛?榪涘叆“娉ㄩ噴” 鐘舵€併€?/
state = STAT_COMMENT;
}
else
{
}
}
case STAT_COMMENT:
{
/*榪涘叆瀛愮姸鎬?/
xml_parser_parse_comment(thiz);
state = STAT_NONE;
break;
}
default:break;
}

if(*thiz->read_ptr == '\0')
{
break;
}
}

return;
}

瑙f瀽騫舵病鏈夊湪姝ょ粨鏉燂紝鍘熷洜鏄儚“璧峰TAG”鐘舵€佸拰“澶勭悊鎸囦護”鐘舵€佺瓑錛屽畠浠笉鏄師瀛愮殑錛屽唴閮ㄨ繕鍖呭惈涓€浜涘瓙鐘舵€侊紝濡俆AG鍚嶇О錛屽睘鎬у悕鍜屽睘鎬у€肩瓑錛屽畠浠渶瑕佽繘涓€姝ュ垎瑙c€傚湪鑰冭檻瀛愮姸鎬佹椂錛屾垜浠彲浠ュ繕鎺夊畠鎵€澶勭殑涓婁笅鏂囷紝鍙€冭檻瀛愮姸鎬佹湰韜紝榪欐牱闂浼氬緱鍒扮畝鍖栥€備笅闈㈢湅涓€涓嬭搗濮婽AG鐨勭姸鎬佹満銆?/p>

鍋囪鎴戜滑瑕佽В鏋愪笅闈㈣繖鏍蜂竴涓搗濮婽AG錛?br /> <mime-type xmlns=”http://www.freedesktop.org/standards/shared-mime-info” type=”all/all”>

鎴戜滑搴旇鎬庢牱鍘誨仛鍛紵榪樻槸鎸夊墠闈㈢殑鏂規硶錛岃涓€涓寚閽堟寚鍚戠紦鍐插尯鐨勫ご閮紝鐒跺悗縐誨姩鎸囬拡錛岀洿鍒版寚鍚戠紦鍐插尯鐨勫熬閮ㄣ€傚湪榪欎釜榪囩▼涓紝鎸囬拡鍙兘鎸囧悜錛孴AG鍚嶇О錛屽睘鎬у悕鍜屽睘鎬у€箋€傜敱姝ゆ垜浠彲浠ュ畾涔夊嚭鐘舵€佹満鐨勪富瑕佺姸鎬侊細

1. “TAG鍚嶇О”鐘舵€?br /> 2. “灞炴€у悕”鐘舵€?br /> 3. “灞炴€у€?#8221;鐘舵€?/p>

涓轟簡鏂逛究澶勭悊錛屽啀寮曚袱涓腑闂寸姸鎬侊紝“灞炴€у悕涔嬪墠”鐘舵€佸拰“灞炴€у€間箣鍓?#8221;鐘舵€併€?/p>

鐘舵€佽漿鎹㈠嚱鏁幫細

鍒濆鐘舵€佷負“TAG鍚嶇О”鐘舵€?br /> 1. 鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛岃鍏ョ┖鐧藉瓧絎︼紝榪涘叆“灞炴€у悕涔嬪墠”鐘舵€併€?br /> 2. 鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’鎴?#8216;>’錛岃繘鍏?#8220;緇撴潫”鐘舵€併€?br /> 3. 鍦?#8220;灞炴€у悕涔嬪墠”鐘舵€佷笅錛岃鍏ュ叾瀹冮潪絀虹櫧瀛楃錛岃繘鍏?#8220;灞炴€у悕”鐘舵€併€?br /> 4. 鍦?#8220;灞炴€у悕”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;=’錛岃繘鍏?#8220;灞炴€у€間箣鍓?#8221;鐘舵€併€?br /> 5. 鍦?#8220;灞炴€у€間箣鍓?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;“’錛岃繘鍏?#8220;灞炴€у€?#8221;鐘舵€併€?br /> 6. 鍦?#8220;灞炴€у€?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;”’錛屾垚鍔熻В鏋愬睘鎬у悕鍜屽睘鎬у€鹼紝鍥炲埌“灞炴€у悕涔嬪墠”鐘舵€併€?br /> 7. 鍦?#8220;灞炴€у悕涔嬪墠”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’鎴?#8216;>’錛岃繘鍏?#8220;緇撴潫”鐘舵€併€?/p>

鐢變簬澶勭悊鎸囦護(PI)閲屼篃鍖呭惈浜嗗睘鎬х姸鎬侊紝涓轟簡閲嶇敤灞炴€цВ鏋愮殑鍔熻兘錛屾垜浠妸灞炴€х殑鐘舵€佸啀鎻愬彇涓轟竴涓瓙鐘舵€併€傝繖鏍鳳紝“璧峰TAG”鐘舵€佺殑鍥懼艦琛ㄧず濡備笅錛?br />

涓嬮潰鎴戜滑鐪嬩唬鐮佸疄鐜幫細

static void xml_parser_parse_attrs(XmlParser* thiz, char end_char)
{
int i = 0;
enum _State
{
STAT_PRE_KEY,
STAT_KEY,
STAT_PRE_VALUE,
STAT_VALUE,
STAT_END,
}state = STAT_PRE_KEY;

char value_end = '\"';
const char* start = thiz->read_ptr;

thiz->attrs_nr = 0;
for(; *thiz->read_ptr != '\0' && thiz->attrs_nr < MAX_ATTR_NR; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_PRE_KEY:
{
if(c == end_char || c == '>')
{
/*鍦?#8220;灞炴€у悕涔嬪墠”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’鎴?#8216;>’錛岃繘鍏?#8220;緇撴潫”鐘舵€併€?/
state = STAT_END;
}
else if(!isspace(c))
{
/*鍦?#8220;灞炴€у悕涔嬪墠”鐘舵€佷笅錛岃鍏ュ叾瀹冮潪絀虹櫧瀛楃錛岃繘鍏?#8220;灞炴€у悕”鐘舵€併€?/
state = STAT_KEY;
start = thiz->read_ptr;
}
}
case STAT_KEY:
{
if(c == '=')
{
/*鍦?#8220;灞炴€у悕”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;=’錛岃繘鍏?#8220;灞炴€у€間箣鍓?#8221;鐘舵€併€?/
thiz->attrs[thiz->attrs_nr++] = (char*)xml_parser_strdup(thiz, start, thiz->read_ptr - start);
state = STAT_PRE_VALUE;
}

break;
}
case STAT_PRE_VALUE:
{
/*鍦?#8220;灞炴€у€間箣鍓?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;“’錛岃繘鍏?#8220;灞炴€у€?#8221;鐘舵€併€?/
if(c == '\"' || c == '\'')
{
state = STAT_VALUE;
value_end = c;
start = thiz->read_ptr + 1;
}
break;
}
case STAT_VALUE:
{
/*鍦?#8220;灞炴€у€?#8221;鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;”’錛屾垚鍔熻В鏋愬睘鎬у悕鍜屽睘鎬у€鹼紝鍥炲埌“灞炴€у悕涔嬪墠”鐘舵€併€?/
if(c == value_end)
{
thiz->attrs[thiz->attrs_nr++] = (char*)xml_parser_strdup(thiz, start, thiz->read_ptr - start);
state = STAT_PRE_KEY;
}
}
default:break;
}

if(state == STAT_END)
{
break;
}
}

for(i = 0; i < thiz->attrs_nr; i++)
{
thiz->attrs[i] = thiz->buffer + (size_t)(thiz->attrs[i]);
}
thiz->attrs[thiz->attrs_nr] = NULL;

return;
}

璁板緱鍦╔ML閲岋紝鍗曞紩鍙峰拰鍙屽紩鍙烽兘鍙互鐢ㄦ潵鐣屽畾灞炴€у€鹼紝鎵€浠ヤ笂闈㈠姝ゅ仛浜嗙壒孌婂鐞嗐€?/p>

static void xml_parser_parse_start_tag(XmlParser* thiz)
{
enum _State
{
STAT_NAME,
STAT_ATTR,
STAT_END,
}state = STAT_NAME;

char* tag_name = NULL;
const char* start = thiz->read_ptr - 1;

for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_NAME:
{
/*鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛岃鍏ョ┖鐧藉瓧絎︼紝灞炴€у瓙鐘舵€併€?/
/*鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛岃鍏ュ瓧絎?#8216;/’鎴?#8216;>’錛岃繘鍏?#8220;緇撴潫”鐘舵€併€?/
if(isspace(c) || c == '>' || c == '/')
{
state = (c != '>' && c != '/') ? STAT_ATTR : STAT_END;
}
break;
}
case STAT_ATTR:
{
/*榪涘叆“灞炴€?#8221;瀛愮姸鎬?/
xml_parser_parse_attrs(thiz, '/');
state = STAT_END;

break;
}
default:break;
}

if(state == STAT_END)
{
break;
}
}

for(; *thiz->read_ptr != '>' && *thiz->read_ptr != '\0'; thiz->read_ptr++);

return;
}

澶勭悊鎸囦護鐨勮В鏋愬拰璧峰TAG鐨勮В鏋愬熀鏈笂鏄竴鏍風殑錛岃繖閲屽彧鏄湅涓€涓嬩唬鐮侊細

static void xml_parser_parse_pi(XmlParser* thiz)
{
enum _State
{
STAT_NAME,
STAT_ATTR,
STAT_END
}state = STAT_NAME;

char* tag_name = NULL;
const char* start = thiz->read_ptr;

for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_NAME:
{
/*鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛岃鍏ョ┖鐧藉瓧絎︼紝灞炴€у瓙鐘舵€併€?/
/*鍦?#8220;TAG鍚嶇О”鐘舵€佷笅錛?#8216;>’錛岃繘鍏?#8220;緇撴潫”鐘舵€併€?/
if(isspace(c) || c == '>')
{
state = c != '>' ? STAT_ATTR : STAT_END;
}

break;
}
case STAT_ATTR:
{
/*榪涘叆“灞炴€?#8221;瀛愮姸鎬?/
xml_parser_parse_attrs(thiz, '?');
state = STAT_END;
break;
}
default:break;
}

if(state == STAT_END)
{
break;
}
}

tag_name = thiz->buffer + (size_t)tag_name;

for(; *thiz->read_ptr != '>' && *thiz->read_ptr != '\0'; thiz->read_ptr++);

return;
}

娉ㄩ噴錛岀粨鏉烼AG鍜屾枃鏈殑瑙f瀽闈炲父綆€鍗曪紝榪欓噷緇撳悎浠g爜鐪嬬湅灝辮浜嗭細

“娉ㄩ噴”瀛愮姸鎬佺殑澶勭悊錛?/p>

static void xml_parser_parse_comment(XmlParser* thiz)
{
enum _State
{
STAT_COMMENT,
STAT_MINUS1,
STAT_MINUS2,
}state = STAT_COMMENT;

const char* start = ++thiz->read_ptr;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;

switch(state)
{
case STAT_COMMENT:
{
/*鍦?#8220;娉ㄩ噴”鐘舵€佷笅錛岃鍏?#8216;-’錛岃繘鍏?#8220;鍑忓彿涓€”鐘舵€併€?/
if(c == '-')
{
state = STAT_MINUS1;
}
break;
}
case STAT_MINUS1:
{
if(c == '-')
{
/*鍦?#8220;鍑忓彿涓€”鐘舵€佷笅錛岃鍏?#8216;-’錛岃繘鍏?#8220;鍑忓彿浜?#8221;鐘舵€併€?/
state = STAT_MINUS2;
}
else
{
state = STAT_COMMENT;
}
break;
}
case STAT_MINUS2:
{
if(c == '>')
{
/*鍦?#8220;鍑忓彿浜?#8221;鐘舵€佷笅錛岃鍏?#8216;>’錛岀粨鏉熻В鏋愩€?/
return;
}
else
{
state = STAT_COMMENT;
}
}
default:break;
}
}

return;
}

“緇撴潫TAG”瀛愮姸鎬佺殑澶勭悊錛?/p>

static void xml_parser_parse_end_tag(XmlParser* thiz)
{
char* tag_name = NULL;
const char* start = thiz->read_ptr;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
/*璇誨叆‘>’錛岀粨鏉熻В鏋愩€?/
if(*thiz->read_ptr == '>')
{
break;
}
}

return;
}

“鏂囨湰”瀛愮姸鎬佺殑澶勭悊錛?/p>

static void xml_parser_parse_text(XmlParser* thiz)
{
const char* start = thiz->read_ptr - 1;
for(; *thiz->read_ptr != '\0'; thiz->read_ptr++)
{
char c = *thiz->read_ptr;
/*璇誨叆‘>’錛岀粨鏉熻В鏋愩€?/
if(c == '<')
{
if(thiz->read_ptr > start)
{
}
thiz->read_ptr--;
return;
}
else if(c == '&')
{
/*璇誨叆‘&’錛岃繘鍏ュ疄浣?entity)瑙f瀽瀛愮姸鎬併€?/
xml_parser_parse_entity(thiz);
}
}

return;
}

瀹炰綋(entity)瀛愮姸鎬佹瘮杈冪畝鍗曪紝榪欓噷涓嶅仛榪涗竴姝ュ垎鏋愪簡錛岀暀緇欒鑰呭仛緇冧範鍚?/p>

]]>
tomcat 鍦╡clipse涓殑閮ㄧ講http://www.aygfsteel.com/shiliqiang/articles/282894.html鐭沖ご@鐭沖ご@Wed, 17 Jun 2009 10:07:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/282894.htmlhttp://www.aygfsteel.com/shiliqiang/comments/282894.htmlhttp://www.aygfsteel.com/shiliqiang/articles/282894.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/282894.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/282894.htmlTomcat婧愮爜瀛︿範錛堜竴錛?/a>

杞嚜:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-263093.html

浣滀負涓€浣?span>Java紼嬪簭鍛橈紝濡傛灉鎮ㄦ病鏈夋帴瑙﹁繃寮€婧愯蔣浠躲€侀」鐩垨妗嗘灦鐨勮瘽錛屾亹鎬曟湁浜涗笉鍙€濊銆傝槳杞扮儓鐑堢殑寮€婧愯繍鍔ㄨ搗婧愪簬Linux鎿嶄綔緋葷粺錛?/span>Apache鍩洪噾浼氬湪鍏朵腑鎵紨浜嗕腑嫻佺牓鏌辯殑瑙掕壊錛屼笟鐣屽法鎿?/span>SUN錛?/span>IBM錛?/span> BEA 鍜?/span>Oracle絳夊叕鍙哥殑縐瀬鍙備笌錛屼嬌寰楀0鍔挎旦澶х殑寮€婧愯繍鍔ㄦ垚涓鴻蔣浠跺紑鍙戦鍩熷娍涓嶅彲鎸$殑鍔涢噺銆?/span>2001騫?/span>11鏈堬紝IBM鍚?/span>Apache鍩洪噾浼氭崘鐚嚭Visual Age for Java錛岃繖涓湅浼肩┓閫旀湯璺殑浜у搧緇忎紬澶氶珮鎵嬬殑鏀歸€狅紝婕斿彉涓鴻緣鐓屼竴鏃剁殑Eclipse錛岀洿鎺ュ嚮璐ヤ簡涓嶅紑婧愮殑JBuilder錛岃鍋氱紪璇戝櫒璧峰鐨?/span>Borland鍏徃鍑犱箮鍏沖紶澶у悏銆?/span>Eclipse榪欎釜浜у搧濡傛緇忓吀錛屼互鑷充簬寰蔣鐨?/span>Visual Studio閮藉緱鍚戝畠瀛︿範銆傚湪Apache Harmony鐨勫洿榪藉牭鎴笅錛?/span>Java鐨勫彂鏄庤€?/span>Sun鍏徃涓€鐪嬪娍澶翠笉濡欙紝浜?/span>2006騫村甯?/span>Java寮€婧愶紝闅忓悗鍙堝叕寮€浜嗗叾鏃楄埌綰т駭鍝?/span>Solaris鐨勬簮浠g爜銆備粖騫?/span>1鏈堬紝寮€婧愮殑姝誨澶淬€佸喎閰瘋嚜縐佺殑寰蔣涔熶笉寰椾笉鍦?/span>MS-RL鍗忚涓嬪叕寮€.Net鐨勬簮浠g爜銆備絾鏄紝鍦ㄨ繖濡傜伀濡傝嵓鐨勫紑婧愯繍鍔ㄤ腑錛屾垜浠腑鍥界殑紼嬪簭鍛樺張鏈夊灝戣礎鐚憿錛屾垜浠紑鍒涗簡鍝簺妗嗘灦銆侀」鐩拰浜у搧錛屼負寮€婧愮晫娣葷爾鍔犵摝鍛紵浠ョ瑪鑰呯煭嫻呯殑鐩厜鐪嬫潵錛屾垜浠寮€婧愮晫璐$尞鐨勪笢瑗挎亹鎬曞緢灝戯紝鑳藉涓庡浗澶栫粡鍏稿紑婧愰」鐩竴杈冮珮涓嬬殑錛屽皯涔嬪張灝戠煟錛?/span>

浣滀負涓€鍚嶄腑鍥界殑紼嬪簭鍛橈紝鍜變滑鑳芥病鏈夐仐鎲懼悧錛熶負浠€涔堢粡鍏哥殑Apache Web Server涓嶆槸涓浗浜哄啓鐨勶紱涓轟粈涔?/span>Linus Torvalds鍦ㄥぇ瀛︽椂浠e氨鍐欏嚭Linux騫舵尟鑷備竴鍛鹼紝搴旇€呬簯闆嗭紱涓轟粈涔?/span>JBoss鑳戒笌宸ㄦ棤闇稿紡鐨?/span>Websphere鐩告姉琛★紱涓轟粈涔?/span>MySQL鑳藉湪Oracle鍜?/span>SQL Server鐨勫す鍑諱笅鍙戝睍騫跺.澶?/span>…… 錛熷姝ょ瓑絳夐棶棰橈紝鍦ㄩ仐鎲句箣浣欙紝鎴戞兂鎴戜滑搴旇鑺辯偣鏃墮棿濂藉ソ鎬濊€冧竴涓嬶紝涓浗鐨勮蔣浠朵駭涓氭€庝箞浜嗭紝涓浗鐨勭▼搴忓憳鍙堟€庝箞鍟︼紵


鍦ㄧ瑪鑰呯湅鏉ワ紝鎴戜滑鐨勭▼搴忓憳瀵瑰紑婧愮殑鐞嗚В鏄浉褰撶嫮闅樼殑銆傚浗瀛﹀ぇ甯堢帇鍥界淮鏇捐榪囷紝鍙ゅ線浠婃潵鎴愬ぇ瀛﹂棶澶т簨涓氳€呰緇忓巻涓夌澧冪晫錛?#8220;鏄ㄥ瑗塊鍑嬬ⅶ鏍戯紝鐙笂楂樻ゼ錛屾湜灝藉ぉ娑礬”錛岃繖鏄涓€閲嶅鐣岋紝榪鋒儤涔燂紱“琛e甫娓愬緇堜笉鎮旓紝涓轟紛娑堝緱浜烘啍鎮?#8221;錛岃嫤鑻︽眰绱箣澧冪晫涔燂紱絎笁閲嶅鐣屼負“浼楅噷瀵諱粬鍗冪櫨搴︼紝钃︾劧鍥為錛岄偅浜哄嵈鍦ㄧ伅鐏槕鐝婂”錛岀粡鍘嗗灝戞鐨勫け璐ュ拰鎸姌鍚庯紝緇堜簬鍙傞€忕湡璋涳紝棰嗘偀鐪熺悊銆傛垜瑙夊緱寮€婧愪篃鏈変笁閲嶅鐣岋細


棣栧厛錛屾垜浠鏁炲紑蹇冭兏錛屾嫢鎶卞紑婧愶紙
Open to Open Source)銆傝繖閲嶅鐣屾垜浠ぇ瀹墮兘鑳藉仛鍒幫紝鎷挎潵涓諱箟鍢涳紝璋佷漢涓嶄細銆傚綋鎴戜滑鐨勯」鐩渶瑕佹暟鎹簱鏃訛紝灝卞幓涓嬭澆涓€涓厤璐筂ySQL錛涢渶瑕両DE鏃訛紝鍘諱笅杞? Eclipse錛涢渶瑕佺増鏈帶鍒跺伐鍏鋒椂錛屽氨鍘諱笅杞紺VS錛涢渶瑕佸啓鎼滅儲寮曟搸鏃訛紝Lucene鍙兘鏄垜浠殑鏈€鐖憋紱褰撴垜浠紑鍙慗2EE Web搴旂敤鏃訛紝Struts/JSF鍔燞ibernate/iBATIS鍐嶅姞涓奡pring鎴栬鎴愪負鎴戜滑鐨勯閫夋灦鏋勩€備絾鏄紝鎴戜滑緇濆ぇ閮ㄥ垎紼嬪簭鍛橀兘鍋滅暀鍦ㄨ繖 涓眰嬈′笂錛屽ぇ瀹朵笅杞戒箣鍚庯紝鐪嬬湅鏂囨。浠嬬粛錛屽畨瑁呫€侀厤緗茍鑳借繍琛岋紝灝變互涓轟竾浜嬪ぇ鍚夛紝涓€鍒囬『鍒┿€傚伓灝旈亣鍒頒竴浜涢棶棰橈紝鍘籊oogle涓€鎼滐紝絳旀绔嬮┈鍙緱銆?

鍏舵錛屾垜浠娣卞叆寮€婧愶紝浜嗚В寮€婧愶紙
Dig into Open Source)銆傝杈懼埌榪欎釜灞傛錛屽氨鏈変簺闅懼害浜嗐€傛垜浠笉浣嗚鐭ュ叾鐒訛紝榪樿鐭ュ叾鎵€浠ョ劧銆?#8220;鐭ュ叾鎵€浠ョ劧”鐨勬渶濂藉姙娉曞氨鏄笅杞芥簮浠g爜錛屼粩緇嗙爺璇伙紝鎻f懇騫墮浼氭簮浠? 鐮佺殑綺句箟錛岀湅鐪嬭繖浜涚粡榪囪澶氶珮鎵嬩慨鏀圭殑婧愪唬鐮佺┒绔熻棌鏈変粈涔堢巹鏈猴紝鎴戜滑鑳戒粠鍏朵腑瀛︿範鍒板摢浜涜璁℃€濇兂鍙婅璁℃ā寮忥紝鑳藉鐢ㄥ叾涓摢浜涙簮浠g爜錛屼漢瀹惰繍鐢ㄤ簡鍝簺杞歡綆? 鐞嗘€濇兂鎶婅繖浜涙潵鑷笘鐣屽悇鍦扮▼搴忓憳鐨勫姵鍔ㄦ眹闆嗘垚涓€涓駭鍝侊紝浠g爜鏋舵瀯濡備綍錛岃蔣浠墮厤緗鐞嗗張鏄€庢牱榪涜鐨?#8230;…錛岀瓑絳夌瓑絳夛紝鎴戜滑浠庢簮浠g爜涓涔犵殑涓滆タ澶浜嗐€傚湪闃? 璇繪簮浠g爜鏃訛紝鎴戜滑瑕佸闂嚜宸卞嚑涓負浠€涔堬紝榪欐牱灝變細鏀惰幏鏇村銆?

鍐嶆錛屾垜浠铻嶅叆寮€婧愶紝璐$尞寮€婧愶紙
Get involved in Open Source)銆傚綋鎴戜滑褰誨簳鐞嗚В璇ラ」鐩簮浠g爜鍚庯紝鎴戜滑搴斿彂鎸ヤ竴涓?#8220;浜轟漢涓烘垜錛屾垜涓轟漢浜?#8221;鐨勬€濇兂錛屾垨緇撳悎鎮ㄧ殑瀹為檯闇€瑕侊紝鎴栫粨鍚堟偍鐨勬柊鎯蟲硶錛屾垨閽堝Mail lists涓婄殑闂錛屽璇ュ紑婧愰」鐩姞浠ユ敼榪涘拰鍒涙柊錛屽茍鎶婅嚜宸辯殑浠g爜璐$尞鍑烘潵錛岃澶у璇勪及銆傚綋鐒訛紝濡傛灉鎮ㄦ湁濂界殑鎯蟲硶錛屾偍瀹屽叏鍙互鍒涘緩鑷繁鐨勫紑婧愰」 鐩紝Apache鍩洪噾浼氫腑浼楀鐨勫紑婧愰」鐩笉閮芥槸鎴戜滑騫垮ぇ紼嬪簭鍛樹竴鎵嬪垱寤虹殑鍚楋紵浣嗘槸錛屽湪鍒涘緩鏂板紑婧愰」鐩椂錛屽垏蹇屼笉瑕侀噸鏂板彂鏄庤疆瀛愩€?

絎旇€呮墠鐤忓嫻咃紝鎯充互
Apache Jakarta欏圭洰鍖呬腑鐨勬牳蹇冮」鐩甌omcat涓轟緥錛屽笇鏈涢€氳繃闃呰婧愮爜錛岃兘浠庤繖涓粡鍏擱」鐩腑瀛﹀埌鏇村鐨勪笢瑗匡紝涓烘垜浠腑鍥界殑寮€婧愪簨涓氳搗鍒版姏鐮栧紩鐜夌殑浣滅敤銆?

涓嬮潰鎴戜滑灝卞紑濮嬫垜浠殑
Tomcat婧愮爜瀛︿範涔嬫梾銆?

1. 涓嬭澆
Tomcat6.0鐨勬簮浠g爜

棣栧厛錛屾垜浠緱涓嬭澆Tomcat6.0鐨勬簮浠g爜銆俆omcat婧愪唬鐮佺殑鐗堟湰鎺у埗宸ュ叿涓嶆槸CVS錛岃€屾槸Subversion錛屽鏋滄偍鐨勬満鍣ㄤ笂娌℃湁瀹夎Subversion錛岃浠?/span>
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 涓嬭澆騫跺畨瑁呰繖涓紑婧愮殑鐗堟湰鎺у埗宸ュ叿銆傚綋鐒訛紝濡傛灉鎮ㄦ兂浠?/span>Eclipse涓洿鎺ュ鍏?/span>Tomcat婧愪唬鐮侊紝璇蜂粠http://subclipse.tigris.org/update_1.0.x涓嬭澆Subversion鎻掍歡錛屽嵆鍙鍏?/span>Tomcat婧愪唬鐮併€傚畨瑁呭畬鎴愬悗錛岃鍦?/span>MS-DOS紿楀彛涓敭鍏?/span>svn export help錛屾偍灝嗕細鐪嬪埌錛?/span>

C:\Documents and Settings\carlwu>svn help export

export: 浜х敓涓€涓棤鐗堟湰鎺у埗鐨勭洰褰曟爲鍓湰銆?/span>

鐢ㄦ硶: 1銆?/span>export [-r REV] URL[@PEGREV] [PATH]

2銆?/span>export [-r REV] PATH1[@PEGREV] [PATH2]

1銆佷粠 URL 鎸囧畾鐨勪粨搴擄紝瀵煎嚭涓€涓共鍑€鐨勭洰褰曟爲鍒?/span> PATH銆傚鏋滄湁鎸囧畾

REV 鐨勮瘽錛屽唴瀹瑰嵆涓鴻鐗堟湰鐨勶紝鍚﹀垯灝辨槸 HEAD 鐗堟湰銆傚鏋?/span> PATH

琚渷鐣ョ殑璇濓紝URL鐨勬渶鍚庨儴浠戒細琚敤鏉ュ綋鎴愭湰鍦扮殑鐩綍鍚嶇О銆?/span>

2銆佸湪宸ヤ綔鍓湰涓紝浠庢寚瀹氱殑 PATH1 瀵煎嚭涓€涓共鍑€鐨勭洰褰曟爲鍒?/span> PATH2銆傚鏋?/span>

鏈夋寚瀹?/span> REV 鐨勮瘽錛屼細浠庢寚瀹氱殑鐗堟湰瀵煎嚭錛屽惁鍒欎粠宸ヤ綔鍓湰瀵煎嚭銆傚鏋?/span>

PATH2 琚渷鐣ョ殑璇濓紝PATH1 鐨勬渶鍚庨儴浠戒細琚敤鏉ュ綋鎴愭湰鍦扮殑鐩綍鍚嶇О銆?/span>

濡傛灉娌℃湁鎸囧畾 REV 鐨勮瘽錛屾墍鏈夌殑鏈湴淇敼閮戒繚鐣欙紝浣嗘槸鏈撼鍏ョ増鏈帶鍒?/span>

鐨勬枃浠朵笉浼氳澶嶅埗銆?/span>



濡傛灉鎸囧畾浜?/span> PEGREV 錛屽皢浠庢寚瀹氱殑鐗堟湰鏈紑濮嬫煡鎵俱€?/span>

鏈夋晥閫夐」:銆傘€傘€傘€傘€傘€?/span>

鎴戜滑鐪嬪埌Subversion緇欐垜浠彁渚涗簡闈炲父鍙嬪ソ鐨勫府鍔╋紝騫朵笖鏄腑鏂囩殑錛岀湅鏉ヤ腑鍥界▼搴忓憳瀵硅繖涓紑婧愰」鐩湁鎵€璐$尞銆傛帴涓嬫潵錛岃鍦?/span>MS-DOS涓嬮敭鍏ワ細

svn export http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_0/ D:\carl_wu\tomcat\src\

榪欎釜鍛戒護鐨勬剰鎬濇槸鎶?/span>Tomcat6.0鐨勬簮浠g爜浠?/span>Subversion搴撲腑瀵煎叆鍒版湰鏈虹殑D:\carl_wu\tomcat\src\鐩綍錛屽懡浠よ繍琛屽悗錛屾偍紼嶇瓑鍑犲垎閽燂紝灝變細鐪嬪埌Tomcat鐨勬簮浠g爜欏哄埄瀵煎叆鍒扮洰鏍囩洰褰曘€備笅闈㈡槸婧愪唬鐮佺殑鐩綍鏈烘瀯錛屼粠榪欎釜鐩綍緇撴瀯涓紝鎴戜滑鍙互鐪嬪嚭璇ラ」鐩殑寮€鍙戣€呬嬌鐢ㄧ殑IDE鏄?/span>Eclipse錛屽洜涓烘垜浠湅鍒頒簡鐔熸倝鐨?/span>.project鍙?/span>.classpath鏂囦歡銆傚鏋滄偍鎵撶畻寮€鍙戜竴涓?/span>Stand alone鐨?/span>Java搴旂敤紼嬪簭錛屼笉濡ㄥ€熼壌涓€涓?/span>Tomcat鐨勭洰褰曠粨鏋勶紝鎶婅剼鏈枃浠舵斁鍦?/span>bin鐩綍錛屽皢xml鍜?/span>properties閰嶇疆鏂囦歡鏀懼湪conf鐩綍涓紝鎶?/span>Java婧愮爜鏂囦歡鏀懼湪java鎴栬€?/span>src鐩綍涓紝璧勬簮鏂囦歡姣斿璇村浘鐗囨枃浠訛紝ini鏂囦歡鍙婂叾瀹冪殑涓€浜涢潤鎬佽祫婧愭枃浠跺彲浠ユ斁鍦?/span>res鐩綍錛屾祴璇曟簮浠g爜鍙互鏀懼湪test鐩綍涓€傝繖鏄竴涓吀鍨嬬殑Java搴旂敤紼嬪簭鐨勭洰褰曟満鏋勶紝絎旇€呬互鍓嶆浘鎺ヨЕ鍒頒竴涓潵鑷編鍥界殑浜у搧錛屽叾婧愪唬鐮佺洰褰曠粨鏋勫拰Tomcat鍙婂叾鐩稿儚銆?/span>






2. 緙栬瘧騫惰繍琛?/span>

浠g爜涓嬭澆鍚庯紝鎴戜滑鎺ヤ笅鏉ュ氨鏄緙栬瘧騫惰繍琛?/span>Tomcat銆備竴鎻愮紪璇戯紝鎴戜滑涓嶇浼氭兂鍒板彲鐖辯殑Ant銆備笉閿欙紝Tomcat姝f槸浠?/span>Ant浣滀負緙栬瘧宸ュ叿錛屽鏋滄偍榪樻病鏈夊畨瑁咃紝璇蜂粠http://ant.apache.org/bindownload.cgi 澶勪笅杞藉茍瀹夎瀹冦€傜劧鍚庯紝璇蜂粠Tomcat鐨勬簮浠g爜鏂囦歡鎵懼埌build.properties.default鏂囦歡錛屽茍灝嗚鏂囦歡澶嶅埗鍒?/span>build.properties錛岀劧鍚庢墦寮€build.properties錛屾壘鍒頒笅闈㈣繖琛岋細

base.path=/usr/share/java

灝嗗畠鏀逛負錛?/span>

base.path= D:/carl_wu/tomcat/share

鍦?/span>Tomcat緙栬瘧榪囩▼涓紝Ant浼氳鎴戜滑涓嬭澆涓€浜涘繀瑕佺殑渚濊禆欏圭洰錛?/span>base.path鐩綍灝辨槸鐢ㄦ潵淇濆瓨榪欎簺欏圭洰鏂囦歡鐨勶紝鎴戜滑鍙互灝嗚繖涓睘鎬ф寚鍚戜竴涓凡緇忓瓨鍦ㄧ殑鐩綍銆備慨鏀瑰畬base.path鍚庯紝鎴戜滑鍥炲埌MS-DOS紿楀彛錛屽垏鎹㈠埌Tomcat婧愪唬鐮佹墍鍦ㄧ洰褰曪紝鐒跺悗榪愯ant download鍛戒護錛屽涓嬪浘鎵€紺猴細





涓€鍒嗛挓鏈埌錛?/span>Ant灝卞憡璇夋垜浠竴涓敊璇茍鎻愮ず鎴戜滑緙栬瘧澶辮觸錛屽叿浣撻敊璇俊鎭涓嬶細

downloadzip:

[get] Getting: http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip
[get] To: D:\carl_wu\tomcat\share\file.zip
[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip to D:\carl_wu\tomcat\share\file.zip

BUILD FAILED

D:\carl_wu\tomcat\src\build.xml:554: The following error occurred while executing this line:

D:\carl_wu\tomcat\src\build.xml:514: Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip to D:\carl_wu\tomcat\share\file.zip

Total time: 41 seconds

榪欎釜緙栬瘧閿欒闈炲父綆€鍗曪紝灝辨槸鎵句笉鍒?/span>http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip 鏂囦歡銆傛湁浜哄彲鑳戒細鎯籌紝Tomcat鐨勭紪璇戝拰Eclipse鐨?/span>JDT鏈変粈涔堝叧緋伙紵鍏跺疄涓嶇劧錛?/span>Tomcat鏄湪Eclipse涓嬪紑鍙戠殑錛屾墍浠ラ渶瑕?/span>Eclipse鐨?/span>JDT錛?/span>Java Development tooling錛夋彃浠舵潵緙栬瘧Tomat婧愪唬鐮併€傛棦鐒舵壘涓嶅埌錛屾垜浠彧濂借嚜宸卞姩鎵嬶紝涓?/span>Google涓€鎼滐紝椹笂鍙戠幇榪欎釜鏂囦歡鐨勬湁鏁堜笅杞藉湴鍧€涓猴細http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip銆傛垜浠?/span>鎵撳紑鍒氭墠鐨?/span>build.properties鏂囦歡錛屽皢鍏?/span>34琛屼慨鏀逛負錛?/span>

jdt.loc= http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

淇敼淇濆瓨build.properties鏂囦歡鍚庯紝閲嶆柊寮€濮?/span>ant download浠誨姟銆傝繖嬈℃垜浠瓑鐨勬椂闂磋緝闀匡紝鍥犱負eclipse-JDT-3.2.zip澶х害鏈?/span>19M錛屼笅杞介渶瑕佷竴孌墊椂闂淬€傛垜浠彲涔樻鏈轟細鍘繪場鏉尪寮勭偣鍜栧暋浠€涔堢殑錛岀瓑鎴戜滑鍝佽尪鍥炴潵錛屽彂鐜版暚涓氱殑铓傝殎Ant鍛婅瘔鎴戜滑緙栬瘧鎴愬姛錛岃櫧鐒剁紪璇戝櫒緇欏嚭鍑犱釜璀﹀憡銆傝繖鏃舵垜浠彲鍙戠幇鍒氭墠鍒涘緩鐨?/span>base.path鐩綍錛?/span>D:\carl_wu\tomcat\share錛変腑宸茬粡涓嬭澆浜?/span>6涓緷璧栭」鐩紝瀹冧滑閮芥槸Tomcat緙栬瘧鎵€蹇呴』鐨勩€?/span>

涓嬮潰灝卞紑濮嬬湡姝g殑緙栬瘧浠誨姟浜嗭紝璇峰湪MS-DOS紿楀彛鍐呴敭鍏?/span>ant騫跺洖杞︼紝Ant灝嗗湪2鍒嗛挓鍐呯紪璇?/span>1000澶氫釜婧愭枃浠跺茍灝?/span>Tomcat閮ㄧ講鍒?/span>output鐩綍銆傜紪璇戦『鍒╁畬鎴愬悗錛岃鎵撳紑Tomcat鐨勬簮浠g爜鐩綍錛屼細鍙戠幇澶氫簡涓€涓?/span>output鐩綍錛岃繖鏄?/span>Ant鐨勭紪璇戝悗鐨勮緭鍑虹洰褰曘€傝鎵撳紑Tomcat婧愪唬鐮佺殑output\build\bin瀛愮洰褰曪紝鍙屽嚮startup.bat鏂囦歡錛屾垜浠嵆鍙垚鍔熷惎鍔?/span>Tomcat6.0錛屾鏃舵垜浠殑緙栬瘧宸ヤ綔灝辯畻欏哄埄瀹屾垚浜嗐€?/span>


3. 瀵煎叆婧愪唬鐮佸埌Eclipse

3.1 璇鋒墦寮€Eclipse錛屾柊寤轟竴涓?/span>Java欏圭洰錛岀劧鍚庣偣鍑?#8220;Next”鎸夐挳錛岃閫夋嫨“Create project from existing source”錛?/span> 騫跺湪Directory鏂囨湰妗嗗唴濉叆鎴戜滑鍒氭墠涓嬭澆鐨?/span>Tomcat婧愪唬鐮佺洰褰曪紙i.e. D:\carl_wu\tomcat\src)錛岀劧鍚庣偣鍑?#8220;Next”鐩磋嚦緇撴潫銆?/span>




3.2 鎴戜滑灝嗕細鐪嬪埌Eclipse鎷掔粷緙栬瘧錛岃繖鏄洜涓?/span>Eclipse鎵句笉鍒拌欏圭洰鎸囧畾鐨勫簱鏂囦歡銆傝鍙沖嚮璇ラ」鐩紝鍦ㄥ脊鍑鴻彍鍗曚腑閫夋嫨“PropertiesàLibraries”錛岀劧鍚庡垹闄や袱涓互TOMCAT_LIBS寮€澶寸殑涓や釜搴撴枃浠訛紝鍙繚鐣欎竴涓?/span>JRE搴撴枃浠訛紝鐒跺悗鐐瑰嚮“OK”鎸夐挳錛岃繖鏃?/span>Eclipse寮€濮嬬紪璇?/span>Tomcat婧愪唬鐮侊紝浣嗘槸鍙戠幇涓€鍫嗛敊璇紝榪欐槸鍥犱負鎴戜滑娌℃湁涓鴻欏圭洰娣誨姞緙栬瘧鎵€蹇呴』鐨?/span>Jar鍖呫€?/span>

3.3 鍑嗗濂?/span>Tomcat欏圭洰鎵€蹇呴』鐨?/span>jar鏂囦歡錛屽叾瀹烇紝鍒氭墠鎴戜滑榪愯ant download浠誨姟鏃訛紝宸茬粡涓嬭澆榪囪繖浜?/span>jar鏂囦歡鍖呫€?/span>

ant.jar 錛堣鍦?/span>ant瀹夎鐩綍鐨?/span>lib瀛愮洰褰曚腑鎷瘋礉錛?/span>

commons-collections-3.1.jar 錛堜粠鍒氭墠Ant涓嬭澆鐨?/span>commons-collections-3.1瀛愮洰褰曚腑鎷瘋礉錛?/span>

commons-dbcp-1.2.1.jar錛堜粠鍒氭墠Ant涓嬭澆鐨?/span>commons-dbcp-1.2.1瀛愮洰褰曚腑鎷瘋礉錛?/span>

commons-logging-1.1.jar錛堝鏋滄偍鏈満娌℃湁榪欎釜jar鍖咃紝璇蜂粠http://commons.apache.org/downloads/download_logging.cgi澶勪笅杞斤級

commons-pool-1.2.jar錛堜粠鍒氭墠Ant涓嬭澆鐨?/span>commons-pool-1.2瀛愮洰褰曚腑鎷瘋礉錛?/span>

org.eclipse.jdt.core_3.2.0.v_671.jar錛堜粠鍒氭墠Ant涓嬭澆鐨?/span>eclipse\plugins瀛愮洰褰曚腑鎷瘋礉錛?/span>

3.4 褰撴垜浠噯澶囧ソ榪欎簺jar鏂囦歡鍚庯紝灝嗚繖浜涙枃浠舵嫹璐濆埌鏌愪竴鐩綍錛堟瘮濡傝D:\carl_wu\tomcat\tomcat_lib鐩綍錛夛紝鐒跺悗鍦?/span>Eclipse涓柊寤轟竴涓?/span>User Libraries錛屾垜浠皢榪欎釜鏂板緩鐨?/span>User Libraries鍛藉悕涓?/span>TOMCAT_LIBS錛屽茍鎶婅繖浜涙枃浠跺姞鍒?/span>TOMCAT_LIBS銆傜劧鍚庡皢鎴戜滑鏂板緩鐨?/span>TOMCAT_LIBS娣誨姞鍒?/span>Tomcat6欏圭洰銆傚彟澶栵紝鍒繕浜嗘妸JUnit搴撲篃鍔犲埌Tomcat6欏圭洰銆傝繖鏃?/span>Eclipse寮€濮嬮噸鏂扮紪璇戯紝緙栬瘧榪囩▼欏哄埄閫氳繃錛屾墍鏈夐敊璇潎娑堝け錛屾鏃?/span>Tomcat6欏圭洰鐨勭洰褰曠粨鏋勫涓嬶細





榪樻湁錛岃鎶?/span>test鐩綍涔熷姞鍏ュ埌婧愪唬鐮佷腑錛屾柟娉曟槸鍦?/span>Eclipse涓彸鍑?/span>”test”鐩綍錛岀劧鍚庡湪寮瑰嚭鑿滃崟涓€夋嫨“Build path”à”Use as Source Folder”錛屼箣鍚庢垜浠細鐪嬪埌test鐩綍涓婂氨澶氫簡涓簮浠g爜鐨勭鍙鳳紝濡備笂鍥炬墍紺恒€?/span>

3.5鍦?/span>Eclipse涓繍琛?/span>Tomcat銆傝鎵懼埌Tomcat鐨勫惎鍔ㄤ富綾?/span>org.apache.catalina.startup.Bootstrap錛屽彸鍑昏繖涓被錛屽湪寮瑰嚭鑿滃崟涓€夋嫨“Run As…”à”Open Run Dialog…”錛岀劧鍚庡湪寮瑰嚭鐨?#8220;Run”紿楀彛涓~鍏ョ▼搴忚繍琛屽弬鏁?#8220;start”鍜?/span>JVM榪愯鍙傛暟catalina.home錛屽涓嬮潰紿楀彛鎵€紺猴細




鐒跺悗鐐瑰嚮“Run”鎸夐挳錛屾垜浠皢浼氱湅鍒?/span>Tomcat姝e父鍚姩銆傛伃鍠滐紝鍜變滑鐨?/span>Tomcat婧愮爜宸茬粡鎴愬姛瀵煎叆Eclipse錛岃繖鏃訛紝鍙鍖栫殑UML鍒嗘瀽宸ュ叿鍙?/span>Debug宸ュ叿灝辮兘媧句笂鐢ㄥ満浜嗐€?/span>

3.5 璋冭瘯Tomcat錛岃鎵撳紑org.apache.jasper.compiler.Compiler綾葷殑婧愪唬鐮侊紝鍦?/span>generateJava()鏂規硶鐨勭涓€琛屾墦涓€涓柇鐐癸紝鐒跺悗鍦?/span>Eclipse鐨勮皟璇曠姸鎬佷笅榪愯Tomcat錛岀瓑Tomcat榪愯鍚庯紝鎵撳紑鎴戜滑鐨勬祻瑙堝櫒錛屽湪鍦板潃鏍忎腑杈撳叆
http://localhost:8080/examples/jsp/jsp2/el/basic-comparisons.jsp騫跺洖杞︼紝鐒跺悗鎴戜滑鍙瀵熷埌Eclipse姝ゆ椂鍒囨崲鑷寵皟璇曡鍥撅細







涓婇潰鐨勫皬瀹為獙琛ㄦ槑鎴戜滑鍙互鍦?/span>Eclipse涓€氳繃Debugger瑙傚療Tomcat鐨勫唴閮ㄨ繍琛屾満鐞嗐€傚彟澶栬ˉ鍏呬竴鐐癸紝涓婇潰鐨?/span>generateJava鏂規硶鏄皢jsp鍔ㄦ€佺紪璇戣嚦java class錛岃繖涓柟娉曞彧鏄湪絎竴嬈¤姹傛垨鑰?/span>Jsp婧愮爜鍙戠敓鍙樺寲鏃舵墽琛岋紝濡傛灉鎮ㄥ啀嬈″湪嫻忚鍣ㄤ腑鍙戦€佸悓鏍風殑璇鋒眰錛屾偍灝嗙湅涓嶅埌涓婂浘鐨?/span>Debug鐣岄潰錛屽洜涓鴻鏂規硶涓嶅啀鎵ц銆?/span>

鍙﹀錛岃繕鏈変竴鐐瑰緢鏈夋剰鎬濄€?/span>Tomcat6浠ュ墠鐗堟湰鐨勬簮浠g爜鍒嗘暎鍦ㄥソ鍑犱釜瀛愰」鐩腑錛屼粬浠垎鍒彨鍋?/span>jakarta-servletapi-5錛?/span>jakarta-tomcat-5錛?/span>jakarta-tomcat-catalina錛?/span>jakarta-tomcat-connectors鍜?/span>jakarta-tomcat-jasper錛屾垜瑙夊緱Tomcat鐨勫紑鍙戣€呭彲鑳藉珜榪欐牱鍋氬お楹葷儲浜嗭紝鎵€浠?/span>Tomcat6鐗堟湰涓皢榪欎簺瀛愰」鐩兘鍚堝茍鍦ㄤ竴璧蜂簡銆備絾鏄紝榪欑鍋氭硶涓嶅埄浜庢垜浠槄璇葷悊瑙f簮浠g爜



]]>
主站蜘蛛池模板: 昆山市| 安溪县| 集安市| 乐业县| 申扎县| 新龙县| 江阴市| 同仁县| 嘉鱼县| 甘洛县| 河北省| 兴文县| 汉中市| 阿图什市| 来凤县| 涟水县| 衢州市| 建瓯市| 武陟县| 孟州市| 依兰县| 高唐县| 灌南县| 喀喇沁旗| 隆德县| 色达县| 青阳县| 东乡县| 怀来县| 科尔| 利津县| 阿合奇县| 曲阜市| 吴忠市| 池州市| 舞阳县| 普兰县| 焉耆| 武穴市| 隆子县| 阜城县|