摘要: 本文以系統(tǒng)的struct timeval為例,使其支持+、-、+=、-=4種算術運算和<,<=,>,>=,==、!= 6種關系運算,這樣一來就免去了顯式調用函數的麻煩,使代碼簡潔優(yōu)雅,實現如下
Code highlighting produced by Actipro CodeHighlighter (freeware)htt...
閱讀全文
posted @
2013-10-28 23:37 春秋十二月 閱讀(1545) |
評論 (2) |
編輯 收藏
繼上篇
TCP/IP FAQ(1),本篇涵蓋了域和協議、IP編址、插口、原始IP、unix域方面的問題與解答。
【Domain & Protocol】
1. 什么是域,它和協議有什么關系?
域可以理解為一種容納協議的空間,它的存在便于了協議的分類;域和協議是集合與元素的關系,一個域中的每個協議使用同類地址,并且每種地址只被一個域使用,一個域能由協議族或地址族常量唯一標識。
2. TCP/IP中有哪些域及其協議?
internet、iso、route、ccitt、imp、network systems和unix,其中internet域含有ip,icmp,igmp,tcp和udp五種協議,unix域用于ipc通信。
3. 哪些地方會用到域?
一個網絡層協議必須分用輸入數據報,并交給相應的傳輸層協議,由于域包含了協議族,因此必須從對應的域中找到合適的協議去處理。例如IP對應的域為internet,這個域對應的協議族為inetsw,當收到IP數據報時,就從inetsw中找到對應的傳輸層協議去輸入處理。
【IP Addressing】
1. IP地址有哪幾類?
分為5類,A、B和C類用于單播;D類用于多播;E類用于實驗。
2. sockaddr和sockaddr_in有什么區(qū)別聯系?
sockaddr是一種通用的用于接口編址信息的結構,它將硬件與協議的地址細節(jié)相對于接口層隱藏起來,成員依次為sa_len、sa_family和sa_data,而sockaddr_in成員依次為sin_len、sin_family、sin_port、sin_addr和sin_zero。它們的前兩個成員其實是一樣的,只是命名不同,而sockaddr_in中的sin_port標識傳輸層的端口,sin_addr標識IP層的地址,所以它是Internet協議的專用接口編址結構,sin_zero僅為填充用,因為sockaddr_in長度不應小于sockaddr。
3. 插口編址結構允許的最大長度是多少?
sockaddr最后一個成員是可擴展的,這是C語言的通用技術,因為其第一個成員為u_char類型,所以最大長度是255。
4. 一個接口可以配置多個IP地址,是怎么實現的?
ifaddr表示通用的接口地址,ifnet表示接口,它有個類型為ifaddr*的if_addrlist成員,表示當前接口上的地址鏈表。in_ifaddr表示Internet協議專用的接口地址,而IP屬于Internet協議,因此用in_ifaddr表示,所有的IP地址組成一個類型為in_ifaddr*的鏈表。當增加一個IP地址時,就需要插入這兩個鏈表中;當刪除一個IP地址時,就需要從它們當中移除。
5. 為什么配置IP主機地址和網絡掩碼可以是獨立的?
因為它們使用不同的命令實現,前者用SIOCSIFADDR,后者用SIOCSIFNETMASK。當配置IP主機地址時,如果沒有指明網絡掩碼,那么網絡掩碼被設置成默認的。
6. 為什么訪問IP接口地址使用的是UDP插口而不是原始IP插口?
只有超級用戶用程才能創(chuàng)建原始IP插口,而通過UDP插口,任何用戶進程都能查看接口配置。
【Socket】
1. 為什么會存在插口層?
從概念上講,tcp/ip協議棧劃分為鏈路、網絡、傳輸和應用4層;但從實現上講,在應用層和其下層中間,引入了一個插口層,作為進程和內核通信的橋梁,主要功能是將進程發(fā)送的與協議有關的請求映射到產生插口時指定的與協議有關的實現,從而屏蔽了不同協議處理的細節(jié)。
2. 為什么服務器進程總是要調用bind,客戶進程能調用它嗎?
bind將一個本地地址同一個插口相關聯,客戶進程需要同一個已知地址建立連接或發(fā)送數據報到已知地址,如果不調用bind,服務器進程就無法在某個已知地址上接受TCP連接或接收UDP數據報。客戶進程也能調用bind,這樣便可以由應用程序而非內核來選擇一個本地地址,其結果是只能接收目的地址為被綁定地址的數據包,但通常不必調用bind,因為內核會自動決定外出地址和臨時端口。
3. 對于tcp和udp協議的插口,調用connect有什么區(qū)別聯系?
共同點是設定插口的外部地址(插口的地址存儲在相關的協議控制塊中),不同點如下
1)tcp:與遠端系統(tǒng)進行3次握手交互,如果插口是非阻塞的且連接正在進行中,那么返回EINPROGRESS,下次再調用則返回EALREADY;如果連接成功,無論是否阻塞,那么下次再調用會返回EISCONN;如果連接失敗,那么下次再調用,則重新開始三次握手。
2)udp:沒有3次握手交互,直接設定外部地址,無論插口是否阻塞,調用會立即返回,多次調用則會替換老的外部地址。發(fā)送數據必須使用write或目的地址為空的sendto,若sendto目的地址非空,則返回EISCONN。如果沒有事先調用connect,那么調用目的地址為空的sendto則會返回ENOTCONN。
4. 什么情況下調用close會阻塞?
連接已建立且設置了SO_LINGER選項并延時值非零的阻塞插口。
5. 插口IO有哪些系統(tǒng)調用?
發(fā)送有write、writev、sendto和sendmsg,接收有read、readv、recvfrom和recvmsg。注意,send和recv是庫函數而非系統(tǒng)調用,前者調用sendto實現,后者調用recvfrom實現。
6. write、writev、read、readv與sendto、sendmsg、recvfrom、recvmsg有什么不同?
1)前面4個適合于任何描述符,而后面4個只能用于插口。
2)前面4個不支持標志,而后面4個支持。
3)前面前2個不支持目的地址、后2個不支持源地址,而后面前2個支持目的地址、后2個支持源地址。
4)前面4個不支持控制信息,而后面第2個和第4個支持。
7. 如何斷開已連接的udp插口,允許調用sendto向其它主機發(fā)送數據?
由于系統(tǒng)并沒有提供形如disconnect的斷連API,但connect內部實現是先斷連,再調用對應協議的PRU_CONNECT請求處理,因此向connect傳遞無效的外部地址結構(如IP=0.0.0.0,Port=0),雖然這樣會導致結果失敗,但先前的斷連成功,對應pcb的外部地址被設為INADDR_ANY,所以調用sendto就不會返回EISCONN。
【Raw IP】
1. 怎么使用原始IP,它有哪些用途及應用?
創(chuàng)建SOCK_RAW類型的原始插口,就能使用原始IP機制,它有下列用途:
1)發(fā)送和接收ICMP和IGMP報文,如ping程序和多播路由守護程序。
2)構造自己的IP首部,如路由跟蹤程序。
3)設計基于IP的新的傳輸層協議,如gated程序。
2. 協議值為PROTOCOL_RAW(255)的原始插口能收到什么類型的IP數據報?
由于255是非零的保留值,這樣的IP數據報在網絡中不會存在,原始IP輸入處理協議比較測試失敗,因此收不到任何類型的IP數據報。
3. 協議值為0的原始插口能收到什么類型的IP數據報?
由于協議值為0,原始IP輸入處理忽略了協議比較測試,因此能收到任何類型的IP數據報。
4. 如何處理收到的IP數據報?
遍歷Internet PCB表,依次從協議值、本地地址和外部地址三項來比較IP數據報和每個PCB,將IP數據報復制追加到所有匹配的PCB對應的插口緩存中,并喚醒等待的進程。
5. 如何發(fā)送數據?
先填充IP首部,如果未設置IP_HDRINCL選項,那么由內核填充,否則由應用程序在發(fā)送前填充,再交給IP協議輸出處理。
6. 內核何時會調用原始輸入?
當收到的協議類型為除IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP和IPPROTO_IGMP外的IP數據報時調用。
【Unix domain】
1. 使用unix域的原因有哪些?
1)當通信雙方在同一主機上時,使用unix域插口的速度比tcp和udp插口要快很多。
2)支持同一主機進程間傳遞描述符。
2. unix域和internet域有什么不同?
1)編址結構不同:前者是sockaddr_un,與文件系統(tǒng)路徑名關聯,而后者是sockaddr_in,與IP地址和端口關聯。
2)協議控制塊不同:前者是unpcb,沒有全局的pcb鏈表,而后者是inpcb,有全局的pcb雙向循環(huán)鏈表。
3. 如果一個unix域服務器在bind后unlink了被綁定的路徑名,會發(fā)生什么情況?
因為connect內部實現查找路徑名失敗,所以連接失敗,但listen會成功,因為bind會創(chuàng)建新的vnode和pcb關聯,且PRU_LISTEN請求實現只檢查vnode是否為空。
4. 如果一個unix域服務器在終止時沒有unlink被綁定的路徑名,會發(fā)生什么情況?
因為connect內部實現雖能找到路徑名但找不到相關的插口,所以連接被拒絕。
5. 系統(tǒng)調用socketpair和pipe有什么區(qū)別聯系?
共同點是使用unix域,即socket調用第1參數為AF_UNIX,不同點如下
1)前者是雙工的,因為兩個插口標志都為讀寫,且它們的pcb相互指向對方;后者是單工的,因為一個插口標志為只讀,另一個為只寫,寫插口的pcb指向讀插口的pcb。
2)前者支持數據報和流式插口,后者僅支持流式插口。
6. unix域是怎么實現傳遞描述符的?
描述符存儲在控制信息cmsghdr內,cms_level=SOL_SOCKET且cms_type=SCM_RIGHTS,unix域的發(fā)送請求實現將描述符轉換為file指針,這個過程叫內部化,接收請求實現把file指針轉換為最小的沒有使用的描述符,這個過程叫外部化。
posted @
2013-09-03 15:52 春秋十二月 閱讀(2371) |
評論 (1) |
編輯 收藏
TCP/IP FAQ系列,以經典的4.4BSD-Lite實現為準,參考《TCP/IP協議詳解》3卷 ,加入個人的思考理解,理清主干,不深究細枝末節(jié),皆在總結基本原理和實現。本篇涵蓋了數據鏈路層、ARP、RARP、IP、ICMP、TCP、UDP方面的問題與解答。
【Data Link】
1. 環(huán)回接口地址必須是127.0.0.1嗎?
形如127.x.x.x的A類IP都可作為環(huán)回接口的地址,但常用的是127.0.0.1。
2. 環(huán)回接口為什么沒有輸入處理?
發(fā)送到環(huán)回接口的數據報實質上被送到網絡層的輸入隊列中,因此數據報沒有離開網絡,也就不可能從鏈路上接收到目標地址為環(huán)回接口地址的數據幀,所以不存在輸入處理。
3. SLIP、環(huán)回和以太網接口,三者有何不同?
SLIP和環(huán)回接口沒有鏈路層首部和硬件地址,環(huán)回接口沒有輸入處理,而以太網接口都有。
4. SLIP和以太網接口如何分用輸入幀,環(huán)回接口如何分用輸出分組?
SLIP將幀直接放進IP輸入隊列中,以太網接口則根據幀類型字段放到對應的協議輸入隊列中,環(huán)回接口則按目的地址族放到對應的輸入隊列中。
5. 接口和地址有什么關聯?
一個接口的編址信息包括主機地址、廣播地址和網絡掩碼,當內核初始化時,每個接口分配一個鏈路層地址,可以配置有多個相同或不同的網絡層地址,例如2個IP地址,或者1個IP地址、1個OSI地址。
【ARP & RARP】
1. 何時發(fā)送ARP請求,何時應答ARP請求?
當單播發(fā)送IP數據并且查詢ARP高速緩存失敗時,就會廣播一個詢問目的主機硬件地址的ARP請求;當接收到ARP請求的主機就是該請求所要查找的目的主機或目的主機的ARP代理服務器時,就會單播一個ARP應答。
2. 為什么兩者的以太網幀類型不同?
ARP值為0x0806,RARP為0x8035,其實對于發(fā)送方來說,利用ARP的op字段可以區(qū)分RARP,但對于接收方,由于ARP實現在內核中,而RARP一般實現為服務器,所以為了更易區(qū)分,就單獨用另一個值標識。
3. 設計RARP服務器有哪些問題?
一是怎么發(fā)送以太網幀以響應請求,這與系統(tǒng)相關。二是當存在多個服務器時,同時發(fā)送響應幀會造成以太網沖突,這可以通過分主從服務器和隨機延時來優(yōu)化避免。
4. ARP在等待應答時,它會如何處理發(fā)往給定目的的多個報文?
在大多數的實現中,在等待一個ARP應答時,只將最后一個報文發(fā)給特定目的主機。Host Requirements RFC要求實現中必須防止這種類型的ARP洪泛,建議最高速率是每秒一次。
5. 免費ARP有什么作用?
一般的ARP請求用于查詢目標硬件地址,并等待應答。而免費的ARP發(fā)出請求并不一定期望應答,這可以有兩方面的作用:
1)一個主機可以確定是否存在相同IP地址的另一主機
2)當本機硬件地址改變時,通知其它主機更新ARP高速緩存。
6. ARP如何映射一個IP多播地址?
先獲取IP多播地址的低23位,再與常量0x01005e7f0000按位或,結果就是對應的多播硬件地址。
【IP】
1. 何時何地分片?
當數據報長度大于鏈路接口MTU且DF=0時,開始分片,分片可發(fā)生在源主機,也可發(fā)生在中途路由器。若需要分片但DF=1,則向源主機發(fā)送ICMP不可達差錯。
2. 如何分片?
1)計算每個分片的數據長度(不含IP首部),除后一個分片外,其它分片數據長度為8字節(jié)的倍數。
2)除復制對應數據外,還復制原始分組的首部及(部分)選項到新的每個分片中,更新新分片首部的頭部長度、總長度、MF標志和偏移量。如果原始分組已經是分片,那么MF=1,否則最后一個分片MF=0,其余MF=1。
3. 何時何地重裝?
由于分片可以有不同的路由,而且中途路由器可能再次分片,因此只有目標主機才能重裝所有分片。當接收端第一次收到一個MF或偏移量非零的分組時,則該分組就是一個必須被重裝的分片,于是開始重裝。
4. 如何重裝?
1)使用4元組{源地址,目標地址,協議,16位標識}為唯一標識查找當前分片所屬的數據報(分片表),如果沒有找到,則創(chuàng)建分片表,按偏移量將當前分片插入到分片表,并啟動重裝定時器。
2)如果重裝定時器超時后,還沒有組裝好一個完整的IP數據報,此時如果已經收到第一個分片,則向源主機返回ICMP超時差錯,最后丟棄收到的所有分片;否則,提交數據給適當的傳輸層處理。
5. 哪些分組能被轉發(fā),何時轉發(fā)?
到達非最終目的地系統(tǒng)的分組,且當系統(tǒng)配置為可轉發(fā)或分組包含源路由時,才能被轉發(fā),但下列類型的分組除外:1)鏈路層廣播 2)環(huán)回分組 3)網絡0和E類目標地址 4)D類目標地址。
【ICMP】
1. ICMP報文有哪些類型,何時何地生成這些報文?
包括請求、應答、差錯和重定向4種,其中前兩者可統(tǒng)一為查詢類。請求當需要查詢的時候由進程生成,應答由當內核收到請求報文時生成,當主機發(fā)出的數據報無法成功地提交給目的主機時,目的主機或中間路由器的IP或傳輸協議生成差錯報文,并返回給原來的系統(tǒng)。
2. 內核怎么處理收到的ICMP報文?
ICMP是一種傳輸層協議,其協議號為1,當IP層收到一個ICMP報文時,分用交給ICMP協議輸入處理,ICMP協議輸入根據其類型分別處理:1)請求---生成適當的應答報文 2)差錯---提交給適當的傳輸層協議處理 3)應答---提交給等待ICMP報文的進程 4)重定向---更新路由表,并提交給等待的進程。
3. 怎么發(fā)送ICMP報文?
構造ICMP報文-->計算ICMP檢驗和-->封裝到IP數據報中-->提交給IP協議輸出處理,對于用戶進程,須使用原始IP機制才能發(fā)送。
4. 哪些情況不會產生ICMP差錯報文,為什么?
1)ICMP差錯報文:違反此條可能導致差錯引起差錯,無休止循環(huán)下去。
2)源地址不是單播地址的IP數據報:違反此條導致差錯可能同時發(fā)到多個主機。
3)目的地址是廣播或多播地址的IP數據報:違反此條導致多個主機可能同時響應。
4)作為鏈路層廣播的數據報:違反此條導致多個主機可能同時響應。
5)不是IP分片的第一片:違反此條可能導致產生多個ICMP差錯,每個分片一個。
由此可見,違反以上幾條都會引起網絡風暴。
【TCP & UDP】
1. 為什么TCP首部存在首部長度字段,而UDP卻沒有?
TCP首部存在選項,如mss,timestame,nop和wscale等。
2. 為什么這兩種協議首部前面都是源和目的端口?
當TCP收到一個ICMP差錯時,必須檢查兩個端口號以決定差錯對應于哪個連接;只有當UDP套接口連接到對端時,用戶進程才會收到ICMP差錯,例如當服務器未運行時,返回的ICMP端口不可達消息。
3. 當收到TCP或UDP數據包時,怎么提交給應用層?
插口由進程調用socket或accept創(chuàng)建,關聯到對應的PCB(協議控制塊)上,通配匹配數由本地和外部IP地址確定,有3種取值:0--本地和外部IP都不為*、1--本地或外部IP有一個為*和2--本地和外部IP都為*。與UDP不同的是,TCP還有自己的PCB。
1)TCP:先掃描Internet PCB,查找最小通配匹配數的插口,如果沒找到,那么響應RST包;再查看對應的TCP PCB,若不存在則響應RST包,否則若TCP 狀態(tài)為關閉,則丟棄;最后交付給找到的對應插口。
2)UDP:這里要分2種情況,對于目的地為廣播或多播地址的IP數據報,交付給所有匹配的插口;對于目的地為單播的IP數據報,掃描Internet PCB,查找具有最小通配匹配數的插口,如果沒有找到,則向源主機發(fā)送ICMP端口不可達差錯。如果有多個插口有相同的最小通配匹配數,那么具體由哪個插口接收依賴于不同的實現。
4. 計算首部檢驗和時,為什么要引入偽首部?
這是因為考慮到IP層的可能差錯,TCP和UDP需要驗證數據包是否被遞送到正確的協議和目的主機。
5. UDP何時會計算檢驗和,如何區(qū)分是否使用了檢驗和?
UDP的檢驗和是可選的,當系統(tǒng)沒有禁止(udpcksum非零)時,發(fā)送方會計算檢驗和,接收方還須輸入分組檢驗和非零時才會計算檢驗和。如果檢驗和字段非零,那么就使用了,反之沒有。
6. 在TCP狀態(tài)遷移中,哪些狀態(tài)在什么情況下可直接轉到CLOSED狀態(tài)?
SYN_SENT在連接定時器超時后,FIN_WAIT_2在FIN_WAIT_2定時器超時后。
7. 為什么TCP需要持續(xù)(persist)定時器、FIN_WAIT_2定時器和2MSL定時器?
1)因為連接對端發(fā)送的窗口通告為ACK報文,而ACK是不會確認的,允許TCP繼續(xù)發(fā)送數據的窗口更新可能會丟失,所以需要設定persist定時器,在超時后發(fā)送1字節(jié)的數據,判定對端接收窗口是否已打開。
2)因為在正常情況下,當連接主動關閉時,會由FIN_WAIT_1狀態(tài)進入FIN_WAIT_2狀態(tài)等待接收對端的FIN報文,但對方可能一直不發(fā)送FIN,所以需要FIN_WAIT_2定時器避免連接永遠滯留在FIN_WAI_2狀態(tài)。
3)因為當連接主動關閉進入TIME_WAIT狀態(tài)后,將等待2個MSL時間,在這段時間內,TCP可以重發(fā)丟失的ACK,丟棄來自新連接替身的遲到的報文段以防止被曲解,所以需要2MSL定時器,超時后關閉連接。
8. 當TCP發(fā)送數據,調用ip_output返回ENOBUFS差錯時,可能會發(fā)生什么情況?
當提交給網絡層因為內存不足發(fā)送失敗時,數據包被丟棄。如果丟棄的是數據報文,重傳定時器超時后數據將被重傳;如果丟棄的是純ACK報文,對端收不到ACK時會重傳對應的數據報文;如果丟棄的是RST報文,當對端重傳導致發(fā)送RST報文的數據報文時,將再次生成RST報文。
9. TCP何時發(fā)送ACK報文?
對于數據、SYN和FIN報文,發(fā)送ACK,但對于純ACK和RST報文,不會發(fā)送;另外當遇以下情況時,則立即發(fā)送。
1)200ms延時ACK定時器超時;2)收到失序的報文段;3)三次握手收到了SYN;4)收到了FIN。
10. TCP何時發(fā)送RST報文?
1)當收到報文段,但沒有找到對應的internet pcb或tcp pcb。
2)當連接處于LISTEN狀態(tài)時,收到了ACK報文段。
3)當連接處于SYS_SENT狀態(tài)時,收到了錯誤的ACK報文段(ack小于等于iss或大于snd_max)。
4)當連接被動關閉時(狀態(tài)大于CLOSE_WAIT),收到了數據。
5)當連接處于SYN_RCVD狀態(tài)時,收到了錯誤的ACK報文段(ack小于snd_una或大于snd_max)。
posted @
2013-08-25 10:50 春秋十二月 閱讀(2545) |
評論 (1) |
編輯 收藏
由于從其它平臺如windows傳輸文件到類unix平臺時,用vim等編輯工具打開時,有時會發(fā)現行尾有^M,其實這就是控制字符CR,ASCII碼為13。為方便刪除這個字符,編寫了一個簡單的dos2unix腳本,最多帶2個參數,特點如下:
● 第1個參數表示目標文件或目錄,當為文件時則處理非腳本本身的文件,當為目錄時則根據第2個參數是否遞歸處理子目錄。
● 第2個參數當且僅當第1個參數為目錄時有效,表示是否遞歸處理子目錄,當為空時則不處理,為-r時則處理。
1
#! /bin/bash
2
# dos2unix
3
4
self_name=$(basename "$0")
5
self_dir=$(cd "$(dirname "$0")";pwd)
6
7
transform_file()
8

{
9
name=$(basename "$1")
10
dir=$(dirname "$1")
11
12
if [ "$dir" = "." ]; then
13
dir=$(pwd)
14
fi
15
16
if [ "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then
17
mv $1 $1.old
18
sed 's/^M$//g' $1.old > $1
19
rm $1.old
20
fi
21
}
22
23
transform_dir()
24

{
25
local pdir=$(pwd)
26
cd $1
27
28
for s in `ls`
29
do
30
if [ -f "$s" ]; then
31
transform_file "$s"
32
else
33
if [ -d "$s" ] && [ "$2" -eq "1" ]; then
34
transform_dir "$s" "1"
35
fi
36
fi
37
done
38
39
cd $pdir
40
}
41

42
transform()
43

{
44
if [ -f "$1" ]; then
45
transform_file "$1"
46
else
47
if [ -z "$2" ]; then
48
is_r=0
49
else
50
if [ "$2" = "-r" ]; then
51
is_r=1
52
else
53
echo "Usage: $(basename $0) directory -r"
54
return 1
55
fi
56
fi
57
58
if [ -d "$1" ]; then
59
transform_dir "$1" "$is_r"
60
else
61
echo "$1 is neither file nor directory"
62
return 1
63
fi
64
fi
65
}
66
67
if [ -n "$1" ]; then
68
transform $1 $2
69
else
70
echo "Usage: $(basename $0) file or directory [-r]"
71
exit 1
72
fi
posted @
2013-08-08 19:06 春秋十二月 閱讀(7647) |
評論 (5) |
編輯 收藏
摘要: 由于read、readv、write和writev函數一次讀或寫有時并不能滿足所要求的數據,因此需要多次調用直到要求的字節(jié)數或者出錯。針對這4個系統(tǒng)調用,編寫了對應的xxxn版本,實現如下
Code highlighting produced by Actipro CodeHighlighter (freeware)http:...
閱讀全文
posted @
2013-08-02 19:44 春秋十二月 閱讀(1771) |
評論 (0) |
編輯 收藏
摘要: 基本原理 1)系統(tǒng)CPU使用率等于兩個時間點的CPU非空閑時間差除以CPU時間總量差得到的百分比,這兩者可從/proc/stat文件獲得。 2)系統(tǒng)內存使用率等于系統(tǒng)物理內存消耗量除以系統(tǒng)物理內存總量(memtotal,以KB為單位)得到的百分比,這兩者可從/proc/meminfo文件獲得。 3...
閱讀全文
posted @
2013-05-31 19:04 春秋十二月 閱讀(4957) |
評論 (0) |
編輯 收藏
摘要: 情景分析 現已存在一個可用穩(wěn)定的異步客戶端類http_client_base,該類基于boost asio實現了連接服務器,發(fā)送請求,獲取響應和解析http數據等操作,該類的大致實現框架如下
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.C...
閱讀全文
posted @
2013-03-20 20:47 春秋十二月 閱讀(12310) |
評論 (2) |
編輯 收藏
本文以統(tǒng)計磁盤文件系統(tǒng)已用空間為例說明awk的用法,使用命令df可獲得磁盤文件系統(tǒng)的相關信息,如下圖所示
第3列Used便是已用空間的數據,這是正常的情形。當第1列Filesystem文本過長時,就有可能換行輸出,這是特殊的情形,如下圖所示
針對這兩種情形,如何寫出有效的命令腳本來統(tǒng)計Used列的數據和呢?從上面兩圖觀察對比顯然可得,以空白符開頭的文本行便是特殊情形,需要計算的是第2列;而正常情形的文本行,便是第3列。因此可得出awk腳本:
awk '{ if($0~/^ /) s+=$2; else s+=$3;} END{ print "Used total is: "s }'。
用于正常情形,輸出如下
而特殊情形,則輸出如下
posted @
2012-11-01 17:47 春秋十二月 閱讀(1697) |
評論 (1) |
編輯 收藏
摘要: 引言
在面向對象類的設計中,有時為了強化效能,特別是當構造大量小對象時,為了改善內存碎片,就需要自己實現對象的內存管理,以替換系統(tǒng)缺省的分配和釋放行為,即全局的new和delete。按照c++標準,在定制類專屬的new和delete時,為了減免客戶代碼使用時的麻煩和問題,需要考慮同時定制簡單(normal new)、定位(placement new)和無異常(...
閱讀全文
posted @
2012-09-27 17:37 春秋十二月 閱讀(2081) |
評論 (2) |
編輯 收藏
摘要: 情景分析
在網絡編程中,通常異步比同步處理更為復雜,但由于異步的事件通知機制,避免了同步方式中的忙等待,提高了吞吐量,因此效率較高,在高性能應用開發(fā)中,經常被用到。而在處理異步相關的問題時,狀態(tài)機模式是一種典型的有效方法,這在libevent、memcached、nginx等開源軟件(庫)中多次被使用而得到見證。據此,為拋磚引玉,本文展示了使用此方法異步接收變...
閱讀全文
posted @
2012-09-20 15:48 春秋十二月 閱讀(2818) |
評論 (2) |
編輯 收藏