版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、摘要網(wǎng)絡(luò)爬蟲(Web Crawler),通常被稱為爬蟲,是搜索引擎的重要組成部分。隨著信息技術(shù)的飛速進步,作為搜索引擎的一個組成部分網(wǎng)絡(luò)爬蟲,一直是研究的熱點,它的好壞會直接決定搜索引擎的未來。目前,網(wǎng)絡(luò)爬蟲的研究包括Web搜索策略研究的研究和網(wǎng)絡(luò)分析的算法,兩個方向,其中在Web爬蟲網(wǎng)絡(luò)搜索主題是一個研究方向,根據(jù)一些網(wǎng)站的分析算法,過濾不相關(guān)的鏈接,連接到合格的網(wǎng)頁,并放置在一個隊列被抓取。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈
2、接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。如果把整個互聯(lián)網(wǎng)當成一個網(wǎng)站,那么網(wǎng)絡(luò)爬蟲就可以用這個原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取下來。關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;Linux Socket;C/C+;多線程;互斥鎖AbstractWeb Crawler, usually called Crawler for short, is an important part of search engine. With the high-speed development of information, Web Crawler- the search engine can not l
3、ack of- which is a hot research topic those years. The quality of a search engine is mostly depended on the quality of a Web Crawler. Nowadays, the direction of researching Web Crawler mainly divides into two parts: one is the searching strategy to web pages; the other is the algorithm of analysis U
4、RLs. Among them, the research of Topic-Focused Web Crawler is the trend. It uses some webpage analysis strategy to filter topic-less URLs and add fit URLs into URL-WAIT queue.The metaphor of a spider web internet, then Spider spider is crawling around on the Internet. Web spider through web link add
5、ress to find pages, starting from a one page website (usually home), read the contents of the page, find the address of the other links on the page, and then look for the next Web page addresses through these links, so has been the cycle continues, until all the pages of this site are crawled exhaus
6、ted. If the entire Internet as a site, then you can use this Web crawler principle all the pages on the Internet are crawling down.Keywords:Web crawler;Linux Socket;C/C+; Multithreading;Mutex目 錄 TOC o 1-3 h z u HYPERLINK l _Toc9298 摘要 PAGEREF _Toc9298 I HYPERLINK l _Toc23732 第一章 概 述 PAGEREF _Toc2373
7、2 1 HYPERLINK l _Toc24707 1.1 課題背景 PAGEREF _Toc24707 1 HYPERLINK l _Toc9765 1.2 網(wǎng)絡(luò)爬蟲的歷史和分類 PAGEREF _Toc9765 1 HYPERLINK l _Toc6719 1.2.1 網(wǎng)絡(luò)爬蟲的歷史 PAGEREF _Toc6719 1 HYPERLINK l _Toc1635 1.2.2 網(wǎng)絡(luò)爬蟲的分類 PAGEREF _Toc1635 2 HYPERLINK l _Toc25167 1.3 網(wǎng)絡(luò)爬蟲的發(fā)展趨勢 PAGEREF _Toc25167 3 HYPERLINK l _Toc16498 1.4
8、系統(tǒng)開發(fā)的必要性 PAGEREF _Toc16498 3 HYPERLINK l _Toc6017 1.5 本文的組織結(jié)構(gòu) PAGEREF _Toc6017 3 HYPERLINK l _Toc10332 第二章 相關(guān)技術(shù)和工具綜述 PAGEREF _Toc10332 5 HYPERLINK l _Toc13410 2.1 網(wǎng)絡(luò)爬蟲的定義 PAGEREF _Toc13410 5 HYPERLINK l _Toc4732 2.2 網(wǎng)頁搜索策略介紹 PAGEREF _Toc4732 5 HYPERLINK l _Toc30684 2.2.1 廣度優(yōu)先搜索策略 PAGEREF _Toc30684 5
9、 HYPERLINK l _Toc30245 2.3 相關(guān)工具介紹 PAGEREF _Toc30245 6 HYPERLINK l _Toc10171 2.3.1 操作系統(tǒng) PAGEREF _Toc10171 6 HYPERLINK l _Toc9876 2.3.2 軟件配置 PAGEREF _Toc9876 6 HYPERLINK l _Toc25703 第三章 網(wǎng)絡(luò)爬蟲模型的分析和概要設(shè)計 PAGEREF _Toc25703 8 HYPERLINK l _Toc23623 3.1 網(wǎng)絡(luò)爬蟲的模型分析 PAGEREF _Toc23623 8 HYPERLINK l _Toc32592 3.2
10、 網(wǎng)絡(luò)爬蟲的搜索策略 PAGEREF _Toc32592 8 HYPERLINK l _Toc23084 3.3 網(wǎng)絡(luò)爬蟲的概要設(shè)計 PAGEREF _Toc23084 10 HYPERLINK l _Toc4578 第四章 網(wǎng)絡(luò)爬蟲模型的設(shè)計與實現(xiàn) PAGEREF _Toc4578 12 HYPERLINK l _Toc5457 4.1 網(wǎng)絡(luò)爬蟲的總體設(shè)計 PAGEREF _Toc5457 12 HYPERLINK l _Toc16639 4.2 網(wǎng)絡(luò)爬蟲的具體設(shè)計 PAGEREF _Toc16639 12 HYPERLINK l _Toc15092 4.2.1 URL類設(shè)計及標準化URL
11、PAGEREF _Toc15092 12 HYPERLINK l _Toc14665 4.2.2 爬取網(wǎng)頁 PAGEREF _Toc14665 13 HYPERLINK l _Toc4127 4.2.3 網(wǎng)頁分析 PAGEREF _Toc4127 14 HYPERLINK l _Toc4807 4.2.4 網(wǎng)頁存儲 PAGEREF _Toc4807 14 HYPERLINK l _Toc16194 4.2.5 Linux socket通信 PAGEREF _Toc16194 16 HYPERLINK l _Toc32425 4.2.6 EPOLL模型及其使用 PAGEREF _Toc32425
12、 20 HYPERLINK l _Toc2908 4.2.7 POSIX多線程及其使用 PAGEREF _Toc2908 22 HYPERLINK l _Toc30776 第五章 程序運行及結(jié)果分析 PAGEREF _Toc30776 25 HYPERLINK l _Toc23991 5.1 Makefile及編譯 PAGEREF _Toc23991 25 HYPERLINK l _Toc14899 5.2 運行及結(jié)果分析 PAGEREF _Toc14899 26 HYPERLINK l _Toc2630 第六章 總結(jié)與展望 PAGEREF _Toc2630 30 HYPERLINK l _T
13、oc1064 致 謝 PAGEREF _Toc1064 31 HYPERLINK l _Toc18464 參考文獻 PAGEREF _Toc18464 32第一章 概 述1.1 課題背景網(wǎng)絡(luò)爬蟲,是一種按照一定的規(guī)則,自動的抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻,自動索引,模擬程序或者蠕蟲。網(wǎng)絡(luò)檢索功能起于互聯(lián)網(wǎng)內(nèi)容爆炸性發(fā)展所帶來的對內(nèi)容檢索的需求。搜索引擎不斷的發(fā)展,人們的需求也在不斷的提高,網(wǎng)絡(luò)信息搜索已經(jīng)成為人們每天都要進行的內(nèi)容.如何使搜索引擎能時刻滿足人們的需求。最初的檢索功能通過索引站的方式實現(xiàn),而有了網(wǎng)絡(luò)機器人,即網(wǎng)絡(luò)爬蟲這個技術(shù)之后,搜索引擎的時代便開始
14、一發(fā)不可收拾了。1.2 網(wǎng)絡(luò)爬蟲的歷史和分類 網(wǎng)絡(luò)爬蟲的歷史在互聯(lián)網(wǎng)發(fā)展初期,網(wǎng)站相對較少,信息查找比較容易。然而伴隨互聯(lián)網(wǎng)爆炸性的發(fā)展,普通網(wǎng)絡(luò)用戶想找到所需的資料簡直如同大海撈針,這時為滿足大眾信息檢索需求的專業(yè)搜索網(wǎng)站便應(yīng)運而生了?,F(xiàn)代意義上的搜索引擎的祖先,是1990年由蒙特利爾大學學生Alan Emtage發(fā)明的Archie。雖然當時World Wide Web還未出現(xiàn),但網(wǎng)絡(luò)中文件傳輸還是相當頻繁的,而且由于大量的文件散布在各個分散的FTP主機中,查詢起來非常不便,因此Alan Archie工作原理與現(xiàn)在的搜索引擎已經(jīng)很接近,它依靠腳本程序自動搜索網(wǎng)上的文件,然后對有關(guān)信息進行索引
15、,供使用者以一定的表達式查詢。由于 Archie深受用戶歡迎,受其啟發(fā),美國內(nèi)華達System Computing Services大學于1993年開發(fā)了另一個與之非常相似的搜索工具,不過此時的搜索工具除了索引文件外,已能檢索網(wǎng)頁。當時,“機器人”一詞在編程者中十分流行。電腦“機器人”(Computer Robot)是指某個能以人類無法達到的速度不間斷地執(zhí)行某項任務(wù)的軟件程序。由于專門用于檢索信息的“機器人”程序象蜘蛛一樣在網(wǎng)絡(luò)間爬來爬去,因此, 搜索引擎的“機器人”程序就被稱為“蜘蛛”程序。世界上第一個用于監(jiān)測互聯(lián)網(wǎng)發(fā)展規(guī)模的“機器人”程序是Matthew Gray開發(fā)的World wide
16、 Web Wanderer。剛開始它只用來統(tǒng)計互聯(lián)網(wǎng)上的服務(wù)器數(shù)量,后來則發(fā)展為能夠檢索網(wǎng)站域名。與Wanderer相對應(yīng),Martin Koster于1993年10月創(chuàng)建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“機器人”程序,而是靠網(wǎng)站主動提交信息來建立 自己的鏈接索引,類似于現(xiàn)在我們熟知的Yahoo。隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁變得越來越困難,因此,在Matthew Gray的Wanderer基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進。其設(shè)想是,既然所有網(wǎng)頁都可能有連向其他網(wǎng)站的鏈接,那么從跟蹤一個網(wǎng)站的鏈接開始,就有可能檢索整個互
17、聯(lián)網(wǎng)。到1993年底,一些基于此原理的搜索引擎開始紛紛涌現(xiàn),其中以Jump Station、The World Wide Web Worm(GoTo的前身,也就是今天Overture),和Repository-Based Software Engineering (RBSE) spider最負盛名。然而Jump Station和WWW Worm只是以搜索工具在數(shù)據(jù)庫中找到匹配信息的先后次序排列搜索結(jié)果,因此毫無信息關(guān)聯(lián)度可言。而RBSE是第一個在搜索結(jié)果排列中引入關(guān)鍵字串匹配程 度概念的引擎 最早現(xiàn)代意義上的搜索引擎出現(xiàn)于1994年7月。當時Michael Mauldin將John Leavi
18、tt的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的Lycos。同年4月,斯坦福(Stanford)大學的兩名博士生,David File和美籍華人楊致遠(Gerry Yang)共同創(chuàng)辦了超級目錄索引Yahoo,并成功地使搜索引擎的概念深入人心。從此搜索引擎進入了高速發(fā)展時期。目前,互聯(lián)網(wǎng)上有名有姓的搜索引擎已達數(shù)百家,其檢索的信息量也與從前不可同日而語。比如最近風頭正勁的Google,其數(shù)據(jù)庫中存放的網(wǎng)頁已達30億之巨。隨著互聯(lián)網(wǎng)規(guī)模的急劇膨脹,一家搜索引擎光靠自己單打獨斗已無法適應(yīng)目前的市場狀況,因此現(xiàn)在搜索引擎之間開始出現(xiàn)了分工協(xié)作,并有了專業(yè)的搜索引擎技術(shù)和搜索數(shù)據(jù)庫服務(wù)提供商。像國
19、外Inktomi,它本身并不是直接面向用戶的搜索引擎,但向包括Overture(原GoTo)、 LookSmart、MSN、HotBot等在內(nèi)的其他搜索引擎提供全文網(wǎng)頁搜索服務(wù)。國內(nèi)的百度也屬于這一類(注),搜狐和新浪用的就是它的技術(shù)。因此 從這個意義上說,它們是搜索引擎的搜索引擎。1.2.2 網(wǎng)絡(luò)爬蟲的分類網(wǎng)絡(luò)爬蟲種類繁多,如果按照部署在哪里分,可以分成:(1)服務(wù)器側(cè):一般是一個多線程程序,同時下載多個目標HTML,可以用PHP, Java, Python等做,一般綜合搜索引擎的爬蟲這樣做。但是,如果對方討厭爬蟲,很可能封掉服務(wù)器的IP,服務(wù)器IP又不容易改,另外耗用的帶寬也是較貴。(2)
20、客戶端:很適合部署定題爬蟲,或者叫聚焦爬蟲。做一個與Google,百度等競爭的綜合搜索引擎成功的機會微乎其微,而垂直搜索或者比價服務(wù)或者推薦引擎,機會要多得多,這類爬蟲不是什么頁面都取的,而是只取關(guān)心的頁面,而且只取頁面上關(guān)心的內(nèi)容,例如提取黃頁信息,商品價格信息,還有提取競爭對手 廣告信息的。這類爬蟲可以部署很多,而且可以很有侵略性??梢缘统杀敬罅坎渴?,由于客戶端IP地址是動態(tài)的,所以很難被目標網(wǎng)站封鎖。1.3 網(wǎng)絡(luò)爬蟲的發(fā)展趨勢目前,大多數(shù)的搜索引擎都是基于關(guān)鍵詞的搜索引擎。基于關(guān)鍵字匹配的搜索技術(shù)有較大的局限性:首先,它不能區(qū)分同形異義。其次,不能聯(lián)想到關(guān)鍵字的同義詞。Web商業(yè)化至今,
21、搜索引擎始終保持著網(wǎng)絡(luò)上被使用最多的服務(wù)項目的地位,然而,隨著網(wǎng)上內(nèi)容的爆炸式增長和內(nèi)容形式花樣的不斷翻新,搜索引擎越來越不能滿足挑剔的網(wǎng)民們的各種信息需求。搜索引擎的發(fā)展面臨著兩大難題:一是如何跟上Internet的發(fā)展速度,二是如何為用戶提供更精確的查詢結(jié)果。所以,傳統(tǒng)的引擎不能適應(yīng)信息 技術(shù)的高速發(fā)展,新一代智能搜索引擎作為一種高效搜索引擎技術(shù)的在當今的網(wǎng)絡(luò)信息時代日益引起業(yè)界人士的關(guān)注。搜索引擎己成為一個新的研究、開發(fā)領(lǐng)域。因 為它要用到信息檢索、人工智能、計算機網(wǎng)絡(luò)、分布式處理、數(shù)據(jù)庫、數(shù)據(jù)挖掘、數(shù)字圖書館、自然語言處理等多領(lǐng)域的理論和技術(shù),所以具有綜合性和挑戰(zhàn)性。又 由于搜索引擎有
22、大量的用戶,有很好的經(jīng)濟價值,所以引起了世界各國計算機科學界和信息產(chǎn)業(yè)界的高度關(guān)注,目前的研究、開發(fā)十分活躍,并出現(xiàn)了很多值得注意的動向。1.4 系統(tǒng)開發(fā)的必要性爬蟲程序是一個自動獲取網(wǎng)頁的程序。它為搜索引擎從互聯(lián)網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成部分。爬蟲程序的實現(xiàn)策略,運行效率直接影響搜索引擎的搜索結(jié)果。不同的搜索引擎,會根據(jù)對搜索結(jié)果的不同需求,選擇最合適的爬行策略來搜集互聯(lián)網(wǎng)上的信息。高效,優(yōu)秀的爬蟲程序可以使人們在互聯(lián)網(wǎng)上尋找到更及時,更準確的信息。而現(xiàn)在Linux平臺下開源的搜索引擎資料較少,作為實現(xiàn)最終開發(fā)目標搜索引擎的一部分,本爬蟲程序可以為搜索引擎提供良好的網(wǎng)頁獲取能力,并可
23、以為在Linux下開發(fā)網(wǎng)絡(luò)爬蟲的后來者提供參考。1.5 本文的組織結(jié)構(gòu)本文主要根據(jù)網(wǎng)絡(luò)爬蟲的特點,結(jié)合搜索引擎關(guān)鍵技術(shù),linux網(wǎng)絡(luò)編程,對爬蟲程序的關(guān)鍵技術(shù)做了詳細的分析和研究。然后設(shè)計并實現(xiàn)了一個以抓取相關(guān)關(guān)鍵字內(nèi)容并實現(xiàn)離線瀏覽功能的網(wǎng)絡(luò)爬蟲系統(tǒng)。本文主要分為6個章節(jié),結(jié)構(gòu)安排如下:(1)緒論,對課題的背景研究意義和爬蟲的研究現(xiàn)狀做了簡單介紹。(2)相關(guān)技術(shù)和工具介紹。對網(wǎng)絡(luò)爬蟲的定義、評價指標分類、工作原理并對開發(fā)環(huán)境和工具進行了簡單介紹。并以此引出網(wǎng)絡(luò)爬蟲系統(tǒng)的相關(guān)知識介紹。(3)網(wǎng)絡(luò)爬蟲的模型分析 。對網(wǎng)絡(luò)爬蟲視線中的主要思想以及關(guān)鍵技術(shù)進行了具體的分析。(4)網(wǎng)絡(luò)爬蟲的模型設(shè)計
24、 根據(jù)第三章內(nèi)容。對爬蟲系統(tǒng)進行了詳細設(shè)計,并對本爬蟲系統(tǒng)的模型實現(xiàn)進行具體分析。同時也對使用的技術(shù)進行簡單的介紹。(5)程序運行和結(jié)果分析對程序的編譯運行進行簡單介紹。并對測試結(jié)果進行了簡單分析。(6)總結(jié)和展望。第二章 相關(guān)技術(shù)和工具綜述2.1 網(wǎng)絡(luò)爬蟲的定義定義1:網(wǎng)絡(luò)爬蟲是一個自動提取網(wǎng)頁的程序,它為搜索引擎從Web上下載網(wǎng)頁,是搜索引擎的重要組成部分。通用網(wǎng)絡(luò)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL列表;在抓取網(wǎng)頁的過程中,不斷從當前頁面上抽取新的URL放入待爬行隊列,直到滿足系統(tǒng)的停止條件。定義2:網(wǎng)絡(luò)爬蟲就是根據(jù)一定的網(wǎng)頁分析算法過濾與主題無關(guān)的鏈接,保留相關(guān)
25、的鏈接并將其放入待抓取的URL隊列中;然后根據(jù)一定的搜索策略從隊列中選擇下一步要抓取的網(wǎng)頁URL,并重復(fù)上述過程,直到達到系統(tǒng)的某一條件時停止。所有被網(wǎng)絡(luò)爬蟲抓取的網(wǎng)頁將會被系統(tǒng)存儲,進行一定的分析、過濾,并建立索引,對于網(wǎng)絡(luò)爬蟲來說,這一過程所得到的分析結(jié)果還可能對后續(xù)的抓取過程進行反饋和指導(dǎo)。定義3:如果網(wǎng)頁p中包含超鏈接l,則p稱為鏈接l的父網(wǎng)頁。定義4:如果超鏈接l指向網(wǎng)頁t,則網(wǎng)頁t稱為子網(wǎng)頁,又稱為目標網(wǎng)頁。網(wǎng)絡(luò)爬蟲的基本思路就是按照事先給出的主題,分超鏈接和已經(jīng)下載的網(wǎng)頁內(nèi)容,預(yù)測下一個待抓取的URL及當前網(wǎng)頁的相關(guān)度,保證盡可能多地爬行、下載相關(guān)的網(wǎng)頁,盡可能少地下載無關(guān)網(wǎng)頁。
26、2.2 網(wǎng)頁搜索策略介紹網(wǎng)頁的抓取策略可以分為深度優(yōu)先、廣度優(yōu)先和最佳優(yōu)先三種。深度優(yōu)先在很多情況下會導(dǎo)致爬蟲的陷入(trapped)問題,目前常見的是廣度優(yōu)先和最佳優(yōu)先方法。2.2.1 廣度優(yōu)先搜索策略廣度優(yōu)先搜索策略是指在抓取過程中,在完成當前層次的搜索后,才進行下一層次的搜索。該算法的設(shè)計和實現(xiàn)相對簡單。在目前為覆蓋盡可能多的網(wǎng)頁,一般使用廣度優(yōu)先搜索方法。也有很多研究將廣度優(yōu)先搜索策略應(yīng)用于聚焦爬蟲中。其基本思想是認為與初始URL在一定鏈接距離內(nèi)的網(wǎng)頁具有主題相關(guān)性的概率很大。另外一種方法是將廣度優(yōu)先搜索與網(wǎng)頁過濾技術(shù)結(jié)合使用,先用廣度優(yōu)先策略抓取網(wǎng)頁,再將其中無關(guān)的網(wǎng)頁過濾掉。這些方
27、法的缺點在于,隨著抓取網(wǎng)頁的增多,大量的無關(guān)網(wǎng)頁將被下載并過濾,算法的效率將變低。2.3 相關(guān)工具介紹2.3.1 操作系統(tǒng)本網(wǎng)絡(luò)爬蟲程序開發(fā)環(huán)境為Linux CentOS操作系統(tǒng),并且目標是在Linux下運行,而在其他平臺上會出現(xiàn)各種無法正常運行的問題,所以在此有必要介紹一下該程序的運行環(huán)境,Linux操作系統(tǒng)。Linux是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計思想,是一個性能穩(wěn)定的多用戶網(wǎng)
28、絡(luò)操作系統(tǒng)。而Linux主要作為Linux發(fā)布版(通常被稱為distro)的一部分而使用。Linux發(fā)布版指的就是通常所說的“Linux操作系統(tǒng)”,它可能是由一個組織,公司或者個人發(fā)布的。通常來講,一個Linux發(fā)布版包括Linux內(nèi)核,將整個軟件安裝到計算機上的一套安裝工具,各種GNU軟件,其他的一些自由軟件,在一些特定的Linux發(fā)布版中也有一些專有軟件。發(fā)布版為許多不同的目的而制作,包括對不同計算機硬件結(jié)構(gòu)的支持,對一個具體區(qū)域或語言的本地化,實時應(yīng)用,和嵌入式系統(tǒng)。目前,超過三百個發(fā)布版被積極的開發(fā),最普遍被使用的發(fā)布版有大約十二個。較為知名的有Fedora,Ubuntu,Mageia
29、,紅旗Linux,CentOS等。本程序所使用的開發(fā)操作系統(tǒng)是Linux中比較知名的CentOS。2.3.2 軟件配置在CentOS Linux中,本文主要用的開發(fā)軟件是Vim。一般Linux的發(fā)行版都自帶Vim,Vim是個可配置性極強的文本編輯器,可以進行高效的文本編輯。Vim常被稱作“程序員的編輯器”,其功能如此強大以致許多人認為它就是個完整的IDE。當然,它并不僅僅為程序員而生。面對各種文本編輯,無論是撰寫email還是編輯配置文件,Vim都臻于完美。但是只有你自己配置之后才能變成適合于你自己的開發(fā)工具。所以需要修改Vim的配置文件,常用的有(以下為簡單配置):“不要使用vi的鍵盤模式,
30、而是vim自己的:set nocompatiblehistory文件中需要記錄的行數(shù):set history=100“語法高亮:syntax on“為C程序提供自動縮進:set smartindent“使用C樣式的縮進:set cindent“制表符為4:set tabstop=4“統(tǒng)一縮進為4:set softtabstop=4 set shiftwidth=4還有一點不能忽視,那就是安裝GCC編譯器,因為本文寫的所有代碼都是C/C+格式的。雖說基本上每個發(fā)行版都已經(jīng)安裝了GCC編譯器,但不是很全,為了以防萬一,在終端下執(zhí)行了以下命令:$ yum y install gcc$ yum y i
31、nstall gcc-c+$ yum install make-或者執(zhí)行$ yum groupinstall “Development Tools”-或者執(zhí)行$ yum install gcc gcc-c+ kernel -develGCC下編譯.c文件:gcc o xx xx.c,編譯.cpp文件只需把gcc改為g+即可。在多文件編譯的情況下,這樣的命令會很繁瑣,通常會寫一個或多個Makefile文件來解決這個問題,在本文的最后會講到。第三章 網(wǎng)絡(luò)爬蟲模型的分析和概要設(shè)計3.1 網(wǎng)絡(luò)爬蟲的模型分析網(wǎng)絡(luò)爬蟲框架參考的是一個叫l(wèi)arbin的開源爬蟲,它是由法國的年輕人Sebastien Aill
32、eret獨立開發(fā),用C+語言實現(xiàn),其代碼可以直接在網(wǎng)上可以下載到。以下是本程序爬蟲使用的框架,看起來更像是主題爬蟲的框架。如圖3.1所示。圖 3-1 網(wǎng)絡(luò)爬蟲的基本框架圖首先建立URL任務(wù)列表隊列,即開始要爬取的URL。由URL任務(wù)列表開始,根據(jù)預(yù)先設(shè)定的深度爬取網(wǎng)頁,同時判斷URL是否重復(fù),按照一定算法和排序方式搜索頁面,然后對頁面按照一定算法進行分析,并提取相關(guān)URL,最后將所得URL返回任務(wù)列表隊列。之后將任務(wù)列表中URL重新開始爬取,從而使網(wǎng)絡(luò)爬蟲進行循環(huán)工作。3.2 網(wǎng)絡(luò)爬蟲的搜索策略本文的搜索策略為廣度優(yōu)先搜索策略。如下圖3-2所示。搜索過程為abcdefghijklmnop這樣一
33、個順序。圖3-2 廣度優(yōu)先搜索策略示意圖(1)定義一個狀態(tài)結(jié)點采用廣度優(yōu)先搜索算法解答問題時,需要構(gòu)造一個表明狀態(tài)特征和不同狀態(tài)之間關(guān)系的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)點。不同的問題需要用不同的數(shù)據(jù)結(jié)構(gòu)描述。(2)確定結(jié)點的擴展規(guī)則根據(jù)問題所給定的條件,從一個結(jié)點出發(fā),可以生成一個或多個新的結(jié)點,這個過程通常稱為擴展。結(jié)點之間的關(guān)系一般可以表示成一棵樹,它被稱為解答樹。搜索算法的搜索過程實際上就是根據(jù)初始條件和擴展規(guī)則構(gòu)造一棵解答樹并尋找符合目標狀態(tài)的結(jié)點的過程。廣度優(yōu)先搜索算法中,解答樹上結(jié)點的擴展是沿結(jié)點深度的“斷層”進行,也就是說,結(jié)點的擴展是按它們接近起始結(jié)點的程度依次進行的。首先生成第
34、一層結(jié)點,同時檢查目標結(jié)點是否在所生成的結(jié)點中,如果不在,則將所有的第一層結(jié)點逐一擴展,得到第二層結(jié)點,并檢查第二層結(jié)點是否包含目標結(jié)點 對長度為n+1的任一結(jié)點進行擴展之前,必須先考慮長度為n的結(jié)點的每種可能的狀態(tài)。因此,對于同一層結(jié)點來說,求解問題的價值是相同的,我們可以按任意順序來擴展它們。這里采用的原則是先生成的結(jié)點先擴展。結(jié)點的擴展規(guī)則也就是如何從現(xiàn)有的結(jié)點生成新結(jié)點。對不同的問題,結(jié)點的擴展規(guī)則也不相同,需要按照問題的要求確定。(3)搜索策略為了便于進行搜索,要設(shè)置一個表存儲所有的結(jié)點。因為在廣度優(yōu)先搜索算法中,要滿足先生成的結(jié)點先擴展的原則,所以存儲結(jié)點的表一般設(shè)計成隊列的數(shù)據(jù)結(jié)
35、構(gòu)。搜索的步驟一般是:(1)從隊列頭取出一個結(jié)點,檢查它按照擴展規(guī)則是否能夠擴展,如果能則產(chǎn)生一個新結(jié)點。(2)檢查新生成的結(jié)點,看它是否已在隊列中存在,如果新結(jié)點已經(jīng)在隊列中出現(xiàn)過,就放棄這個結(jié)點,然后回到第(1)步。否則,如果新結(jié)點未曾在隊列中出現(xiàn)過,則將它加入到隊列尾。(3)檢查新結(jié)點是否目標結(jié)點。如果新結(jié)點是目標結(jié)點,則搜索成功,程序結(jié)束;若新結(jié)點不是目標結(jié)點,則回到第(1)步,再從隊列頭取出結(jié)點進行擴展。最終可能產(chǎn)生兩種結(jié)果:找到目標結(jié)點,或擴展完所有結(jié)點而沒有找到目標結(jié)點。3.3 網(wǎng)絡(luò)爬蟲的概要設(shè)計本網(wǎng)絡(luò)爬蟲的開發(fā)目的,通過網(wǎng)絡(luò)爬蟲技術(shù)一個自動提取網(wǎng)頁的程序,實現(xiàn)搜索引擎從自己想要
36、訪問的網(wǎng)上下載網(wǎng)頁,再根據(jù)已下載的網(wǎng)頁上繼續(xù)訪問其它的網(wǎng)頁,并將其下載直到滿足用戶的需求。根據(jù)現(xiàn)實中不同用戶的實際上的各種需求,本項目簡單實現(xiàn)主題爬蟲,本網(wǎng)絡(luò)爬蟲需要達到如下幾個目標:(1)設(shè)計基于多線程的網(wǎng)絡(luò)爬蟲,客戶端向服務(wù)器發(fā)送自己設(shè)定好請求。如圖3-3所示。圖3-3 多線程網(wǎng)絡(luò)爬蟲概要設(shè)計圖模型(2)通過 http將Web服務(wù)器上協(xié)議站點的網(wǎng)頁代碼提取出來。(3)根據(jù)一定的正則表達式提取出客戶端所需要的信息。(4)廣度優(yōu)先搜索可從網(wǎng)頁中某個鏈接出發(fā),訪問該鏈接網(wǎng)頁上的所有鏈接,訪問完成后,再通過遞歸算法實現(xiàn)下一層的訪問。本網(wǎng)絡(luò)爬蟲最終將設(shè)計成一個能夠自動讀寫配置文件并且在后臺自動執(zhí)行的
37、網(wǎng)絡(luò)爬蟲程序。網(wǎng)絡(luò)爬蟲工作流程圖如圖3-4所示。圖3-4 網(wǎng)絡(luò)爬蟲工作流程圖第四章 網(wǎng)絡(luò)爬蟲模型的設(shè)計與實現(xiàn)4.1 網(wǎng)絡(luò)爬蟲的總體設(shè)計根據(jù)本網(wǎng)絡(luò)爬蟲的概要設(shè)計本網(wǎng)絡(luò)爬蟲是一個自動提取網(wǎng)頁的程序,根據(jù)設(shè)定的主題判斷是否與主題相關(guān),再根據(jù)已下載的網(wǎng)頁上繼續(xù)訪問其它的網(wǎng)頁,并將其下載直到滿足用戶的需求。(1)設(shè)計基于多線程的網(wǎng)絡(luò)爬蟲。(2)通過 http協(xié)議將待爬取URL列表對應(yīng)的URL的網(wǎng)頁代碼提取出來。(3)提取出所需要的信息并且通過算法判斷網(wǎng)頁是否和設(shè)定的主題相關(guān)。(4)廣度優(yōu)先搜索,從網(wǎng)頁中某個鏈接出發(fā),訪問該鏈接網(wǎng)頁上的所有鏈接,訪問完成后,再通過遞歸算法實現(xiàn)下一層的訪問,重復(fù)以上步驟???/p>
38、的來說爬蟲程序根據(jù)輸入獲得URL任務(wù)列表,即初始URL種子,把初始種子保存在臨界區(qū)中,按照廣度搜索運算法搜索抓取網(wǎng)頁并提取URL返回到臨界區(qū)中,通過判斷主題相關(guān)度算法判斷相關(guān)度,取出不相關(guān)網(wǎng)頁,從而使整個爬蟲程序循環(huán)運行下去。4.2 網(wǎng)絡(luò)爬蟲的具體設(shè)計4.2.1 URL類設(shè)計及標準化URLURL 的一般形式是::/:/。為了方便處理,設(shè)計了一個名叫URL的類,它包含Host(主機名),Port(端口),F(xiàn)ile(文件路徑),F(xiàn)name(給這張網(wǎng)頁取的名字)。以下代碼是class URL的成員及其成員函數(shù)(摘自web.h):class URLpublic:URL() void SetHost(c
39、onst string& host) Host = host; string GetHost() return Host; void SetPort(int port) Port = port; int GetPort() return Port; void SetFile(const string& file) File = file; string GetFile() return File; void SetFname(const string& fname) Fname = fname; string GetFname() return Fname; URL() private:str
40、ing Host;int Port;string File;string Fname;對URL的處理:此外,注意到在網(wǎng)頁源代碼中,URL有些是絕對路徑,有些是相對路徑,還有一些URL中存在字符#,多個/等等。因此,需要對這些URL進行處理,分別得到每個URL的Host,Port,F(xiàn)ile。以下是本文對URL的設(shè)定:(1)URL的File成員不能以/結(jié)尾,若有則以0填充;若該File成員沒有路徑,則設(shè)定其路徑為/。這樣做的目的是為了便于URL排重。(2)URL的File成員中若有#字符,則刪除它及它以后的字符,剩余的字符串作為File的值。(3)若URL中沒有顯式表明端口,則默認Port成員的值
41、為80。(4)若URL沒有主機屬性,則默認Host成員的值為初始URL的主機名。4.2.2 爬取網(wǎng)頁在分析網(wǎng)頁之前,首先網(wǎng)頁需要被抓取下來,分析一下數(shù)據(jù)從服務(wù)器保存到本地的過程。第一部分:分析之前,首先要明確的是:當從sockfd讀取數(shù)據(jù)時,最前面一部分是和網(wǎng)頁本身無關(guān)的信息,比如有些網(wǎng)頁未找到,就會返回404 not found等服務(wù)信息,類似的,每種情況會返回對應(yīng)的信息,因此,對于一些服務(wù)信息,應(yīng)該不予記錄。當讀到字符時才開始正式記錄網(wǎng)頁內(nèi)容。第二部分:定義一個tmp的字符數(shù)組,用來臨時存放抓取的的網(wǎng)頁,抓取方法與第一部分相同同,都是用read函數(shù),不同的是這里是一塊一塊抓取,效率上能比每
42、次抓取一個字節(jié)要高。有人可能會問,為什么不直接存放到文件中,而要保存到臨時數(shù)組中呢?解釋是:因為下一步分析網(wǎng)頁時,有個URL重定向的過程,程序還會繼續(xù)修改tmp數(shù)組。如果直接保存到文件,那么還得再次打開文件分析網(wǎng)頁,這樣會降低效率,因為在磁盤執(zhí)行讀寫操作總是比在內(nèi)存讀寫慢得多。4.2.3 網(wǎng)頁分析(1)URL提取考慮到網(wǎng)頁中的鏈接格式主要是:title,因此本文通過string自身封裝的find函數(shù)來找到每一個”herf”的位置,接下來的情況稍微有些復(fù)雜,分為三種情況。第一種:URL用雙引號引起來;第二種:以單引號引起來;第三種:URL沒有被引起來。在此使用了一個標記變量(flag)來區(qū)分以上
43、三種情況。(2)URL的重定向考慮到本文的要求不僅僅是抓取網(wǎng)頁本身,還要實現(xiàn)一個離線瀏覽網(wǎng)頁的功能,原有的鏈接不再有效,因此,URL的重定向這一步不可缺少。之前,爬蟲已經(jīng)抓取了一些網(wǎng)頁并存放在了一個名為Pages的文件夾中,而且其中的每個網(wǎng)頁都進行了重命名處理(本文直接以url.Fname的字符串哈希值作文保存網(wǎng)頁的文件名)。那么在本地的URL無論在路徑和文件名上都和原來網(wǎng)頁上的鏈接都是不對應(yīng)的,要想實現(xiàn)和原來一樣的網(wǎng)頁跳轉(zhuǎn),必須修改每個鏈接的herf值。對于原來的鏈接title,假設(shè)現(xiàn)在重命名該網(wǎng)頁為new.html,那么如何處理怎么才能轉(zhuǎn)化成新的鏈接呢?方法有很多,比如可以通過覆蓋和移動,
44、使得兩個引號直接的內(nèi)容為new.html。本文采用的方法如下:現(xiàn)已知第一個引號的位置為pos_1,因此可以調(diào)用string類的insert方法。調(diào)用后的效果如下:title這樣處理不僅屏蔽了”xxx.html”,也避免了刪除原有鏈接等不必要操作,一定程度上提高了代碼的效率。(3) URL判重抓取網(wǎng)頁時有一個非常棘手的問題,那就是重復(fù)抓取問題。大家知道,一個網(wǎng)站中的鏈接非常多,抽象出來就是一個巨大的蜘蛛網(wǎng),類似與圖論中的無向圖。如果不對爬蟲進行設(shè)置,它就像一只無頭蒼蠅一樣,到處亂撞。這樣待抓取隊列里的URL越來越多,并且好多都是重復(fù)的。那么如何才能跳出這個怪圈呢?C+已經(jīng)為大家提供了一個叫set
45、的容器(當然也可以使用hash來判重)。在cplusplus這樣介紹:set是一種存放唯一性元素的關(guān)聯(lián)容器,它里面的每一個元素都稱為關(guān)鍵字,它由二叉搜索樹實現(xiàn)。由于它的唯一性,高效性,把它選擇作為URL判重的一種類似hash的工具。本文代碼如下:定義:setSet;使用:Set.insert(hashVal);4.2.4 網(wǎng)頁存儲前面爬蟲已經(jīng)抓取到了一張網(wǎng)頁,并且進行了重定向處理。那么接下來要做的事就是把它保存到磁盤里,在這一步需要用到文件操作(摘自http.cpp)。chdir(Pages);int fd = open(url_t.GetFname().c_str(), O_CREAT|O_
46、EXCL|O_RDWR, 00770);/* check whether needs re-fetch */if(fd = flen) goto NEXT;else fd = open(url_t.GetFname().c_str(), O_RDWR|O_TRUNC, 00770);if(fd 0) perror(file open error); goto NEXT; else perror(file open error);goto NEXT;write(fd, HtmFile.c_str(), HtmFile.length();NEXT:close(fd);/ todo next以上代碼
47、主要功能是保存已抓取網(wǎng)頁的內(nèi)容到磁盤。有時候在網(wǎng)絡(luò)狀況不理想的情況下,爬蟲抓取有些網(wǎng)頁時會導(dǎo)致請求超時,或抓取內(nèi)容不全,因此為了完善抓取內(nèi)容,可以進行下一次重復(fù)抓取,其抓取條件為:該文件不存在,則直接進行抓??;該文件已經(jīng)存在且當前抓取的內(nèi)容多與上次抓取的,則覆蓋上次保存的文件;其它情況,放棄。第一行代碼使用O_CREAT | O_EXCL | O_RDWR模式打開,當該文件已經(jīng)存在時返回-1,錯誤代碼存放在error中,錯誤代號為EEXIST。代碼中使用stat函數(shù)來讀取參數(shù)為文件名的文件信息,其中我們需要的就是st_size這個成員的內(nèi)容,它以字節(jié)形式記錄了文件的大小。這樣就可以與當前抓取網(wǎng)
48、頁大?。ù娣庞谧兞縡len中)比較,從而判斷是否需要覆蓋原有文件。本文以上代碼雖然使用了不推薦的goto語句,因為程序需要跳過write函數(shù)。不過使用goto語句在沒有給程序帶來混亂的情況下實現(xiàn)了一條break語句實現(xiàn)不了的功能,因此更具實用性。4.2.5 Linux socket通信本文中的socket通信基于TCP,因此有必要提一下TCP的連接和斷開過程。TCP的可靠連接得益于它的三次握手原理,下圖形象的表示了TCP三次握手建立連接和兩次半關(guān)閉斷開連接的具體過程。在連接和斷開連接之間,客戶端和服務(wù)器即可進行雙向的信息通信。圖4-1 TCP三次握手與兩次半關(guān)閉過程在了解各個Socket函數(shù)之
49、前,首先來看一個經(jīng)典的流程圖,幾乎每次網(wǎng)絡(luò)通信都需要走以下流程,它詳細地顯示了TCP客戶端和TCP服務(wù)器之間的Socket通信流程:圖4-2 基于TCP客戶/服務(wù)器程序的套接字函數(shù)及通信流程在程序中,每一個URL對應(yīng)的網(wǎng)頁,在客戶端都需要完成Socket(),Connect(),Write(),Read(),Close()這一過程。要注意的是,如果不及時關(guān)閉Socket文件描述符,有時會出現(xiàn)“open too many files”的系統(tǒng)錯誤,這是由于系統(tǒng)對用戶同時打開多個文件的限制(這里的文件不僅僅指通常意義上的文件,Linux會把任何東西都當做文件,包括目錄、各類描述符等)。而且,以上情況
50、在多線程情況下特別容易出現(xiàn)。(1)socket() 函數(shù)要進行網(wǎng)絡(luò)I/O操作,第一件要做的事就是調(diào)用socket()函數(shù)。該函數(shù)用來產(chǎn)生一個int類型的socket文件描述符,函數(shù)原型:#include int socket(int family, int type, int protocal);返回:若成功則返回非負描述符,否則返回-1。參數(shù): family指明協(xié)議族,有AF_INET,AF_INET6等。type指明套接字類型,有SOCK_STREAM,SOCK_DGRAM等。protocol指明某個協(xié)議類型,常設(shè)為0。例(摘自http.cpp):if(sockfd = socket(PF
51、_INET, SOCK_STREAM, 0) = -1) return -1;至于本文為什么采用PF_INET而不是AF_INET,是因為POSIX下對應(yīng)PF_INET,BSD中對應(yīng)AF_INET。兩者版本不同,但差別微小。(2)connect() 函數(shù)TCP客戶端用connect()函數(shù)來建立與TCP服務(wù)器的連接,在連接之前,需要對該函數(shù)第二個參數(shù)進行初始化操作。函數(shù)原型7:#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);返回:成功返回0,反之返回-1參數(shù):sockfd是
52、由socket函數(shù)返回的套接字描述符第二、第三個參數(shù)分別是一個指向套接字地址結(jié)構(gòu)的指針和該結(jié)構(gòu)的大小,其初始化代碼如下(摘自http.cpp):struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr);server_addr.sin_family = AF_INET;server_addr.sin_port = htons(80); server_addr.sin_addr = *(struct in_addr *)Host-h_addr); 在本例子中,沒有在調(diào)用connect函數(shù)之前調(diào)用bind函數(shù)(用來綁
53、定端口等地址信息),因為在客戶端下除非不是特殊情況,無須調(diào)用。例(摘自http.cpp)if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr) = -1) perror(connect error);return -1;(3)write(), read() 函數(shù)本文使用這兩個函數(shù)來讀寫套接字操作,read函數(shù)從參數(shù)fd讀取內(nèi)容放到參數(shù)buf中;相反,write函數(shù)把參數(shù)buf的內(nèi)容寫入到參數(shù)fd中。#include ssize_t read(int fd, void * buf , size_t
54、 count);返回:返回實際讀到的字節(jié)數(shù),出錯返回-1,錯誤信息存放在errno中。參數(shù):fd為文件描述符;第二個指定要讀入的buf指針指向的內(nèi)存,第三個參數(shù)表明要讀取的字節(jié)數(shù)。#includessize_t write (int fd, const void * buf, size_t count);返回:返回實際寫入的字節(jié)數(shù),出錯返回-1,錯誤信息存放在errno中。參數(shù):與read函數(shù)參數(shù)具有相同意義。在本文中,write函數(shù)的使用是在爬蟲向服務(wù)器發(fā)送請求這一環(huán)節(jié),這里順便了解一下請求的具體內(nèi)容,詳見以下代碼(摘自http.cpp):string Uagent = UAGENT, Co
55、nn = CONN, Accept = ACCEPT;string request = GET /+ url_t.GetFile() + HTTP/1.1rnHost: + url_t.GetHost() + rnUser-Agent: + Uagent + rnAccept: + Accept + rnConnection: + Conn + rnrn; int d, total = request.length(), send = 0;while(send total) if(d = write(sockfd, request.c_str()+send, total-send) 0) re
56、turn -1;send += d;其中的宏定義如下(摘自http.h):#define UAGENT Wget/1.10.2#define ACCEPT */*#define CONN keep-alive其中request的請求內(nèi)容是有一定格式限制的,開頭必須是“GET /” + 要抓取的網(wǎng)頁路徑 + HTTP協(xié)議 + 主機名 + 等,有些選項是可選的。其中的Uagent也可以不指定,雖然不推薦這樣做。因為網(wǎng)站開發(fā)人員若不希望一些爬蟲來訪問他的網(wǎng)頁,他們可以在robot.txt中添加限制某些爬蟲不允許訪問的條件;但這樣問題又來了,使用爬蟲的人希望抓取更多的網(wǎng)頁,因此不希望被服務(wù)器拒絕。這樣
57、的矛盾一直存在,只不過從道德層面上來講,還是加上用戶代理這個選項。常見的用戶代理(User Agent)有Mozilla/4.0,Opera/9.80等。其中需要注意格式的要求,比如空格,回車換行等,最后四個字符(兩個回車,兩個換行)表示命令的結(jié)束。(4)close() 函數(shù)該函數(shù)用來關(guān)閉套接字,并終止TCP連接。函數(shù)原型:#include int close(int sockfd);參數(shù):sockfd為socket函數(shù)返回的套接字描述符。返回:成功返回0,反之返回-1。(5)其它重要函數(shù)前文提到了gethostbyname函數(shù),它通過傳入hostname來返回主機名,結(jié)果指向一個struct
58、 hostent類型的結(jié)構(gòu)體。函數(shù)原型:#include struct hostent *gethostbyname(const char *hostname);參數(shù):hostname為用戶指定的域名。返回:成功返回非空指針,反之則為NULL。/ 例子(摘自http.cpp)if(Host = gethostbyname(hname.c_str() = NULL) return -1;在文本使用的爬蟲中,gethostbyname函數(shù)只需調(diào)用一次,因為本文前提是在同一域名下抓取網(wǎng)頁。當然如果抓取范圍沒有限制,則需對不同域名的網(wǎng)站多次調(diào)用該函數(shù)。/ SetNoblocking函數(shù)(摘自http.
59、cpp)int SetNoblocking(const int& sockfd) int opts = fcntl(sockfd, F_GETFL);/ get file_flag and access modelif (opts 0) return -1;opts |= O_NONBLOCK;/ set nonblockingif (fcntl(sockfd, F_SETFL, opts) 0) return -1;SetNonblocking函數(shù)不是系統(tǒng)函數(shù),本文把它單獨提出來是因為它是實現(xiàn)非阻塞讀寫、connect等操作的開關(guān)。4.2.6 EPOLL模型及其使用(1)EPOLL模型介紹在
60、Linux網(wǎng)絡(luò)編程中,大家常用的是多路復(fù)用IO接口select/poll來觸發(fā)事件,在這里介紹它的增強版epoll。與select/poll相比,epoll最大的好處是不會隨著fd的增加而降低效率,因為select/poll是通過輪詢來處理事件的,因此會隨著fd 的增加效率降低。在epoll中,首先需要了解的有三個函數(shù):int epoll_create(int size);該函數(shù)用來創(chuàng)建一個epoll的文件描述符。參數(shù) size:能夠最大監(jiān)聽的socket fd數(shù)目。在使用完epoll后,必須調(diào)用close()關(guān)閉。int epoll_ctl(int epfd, int op, int fd,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)品展覽租賃承包合同
- 2024年版:建筑工程施工分包協(xié)議書模板
- 醫(yī)療衛(wèi)生經(jīng)費管理規(guī)范
- 品牌故事講述櫥窗施工合同
- 2024年度電商企業(yè)文化建設(shè)與推廣合同6篇
- 珠寶加工工廠房屋租賃合同
- 教育培訓機構(gòu)土地租賃協(xié)議
- 設(shè)備典當合同樣本
- 醫(yī)療服務(wù)科醫(yī)生勞動合同
- 食品安全監(jiān)管投標管理辦法
- 眼科延續(xù)性護理
- 學習新質(zhì)生產(chǎn)力什么是新質(zhì)生產(chǎn)力課件
- 高等數(shù)學(第二版)課件:微分中值定理及導(dǎo)數(shù)的應(yīng)用
- 《公安機關(guān)人民警察內(nèi)務(wù)條令》知識題庫
- 食品營養(yǎng)學(暨南大學)智慧樹知到期末考試答案章節(jié)答案2024年暨南大學
- 中國古建筑文化與鑒賞智慧樹知到期末考試答案章節(jié)答案2024年清華大學
- 2024版《隱患排查標準手冊》(附檢查依據(jù))
- 工程力學智慧樹知到期末考試答案2024年
- 2024年考研英語真題及答案(完整版)
- 30題紀檢監(jiān)察位崗位常見面試問題含HR問題考察點及參考回答
- 小學科學實驗?zāi)夸?-6年級新教科版
評論
0/150
提交評論