91久久在线,久久这里只精品最新地址,欧美另类综合http://www.shnenglu.com/syhd142/zh-cnSun, 24 Aug 2025 12:54:32 GMTSun, 24 Aug 2025 12:54:32 GMT60c語(yǔ)言中有關(guān)void,sizeof,結(jié)構(gòu)體的一些問題http://www.shnenglu.com/syhd142/archive/2011/08/24/154254.htmlFuckerFuckerWed, 24 Aug 2011 14:48:00 GMThttp://www.shnenglu.com/syhd142/archive/2011/08/24/154254.htmlhttp://www.shnenglu.com/syhd142/comments/154254.htmlhttp://www.shnenglu.com/syhd142/archive/2011/08/24/154254.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/154254.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/154254.htmlvoid[1]:
void是C語(yǔ)言中的空類型,void的用途有二。
1、對(duì)函數(shù)返回的限定;
      如果函數(shù)沒有返回值,則默認(rèn)返回整數(shù)類型,而不是void類型。c++有很嚴(yán)格的類型,不允許函數(shù)不加類型聲明,而編譯器則不這么認(rèn)為檢查這一點(diǎn)在VC6.0中可以驗(yàn)證。所以在編寫代碼的時(shí)候,每個(gè)函數(shù)都應(yīng)該加上返回類型。
2、對(duì)函數(shù)參數(shù)的限定;
      在c++中,函數(shù)參數(shù)為void意味著不接受參數(shù),但是在c語(yǔ)言中可以給無參數(shù)的函數(shù)傳遞任意類型的參數(shù),這點(diǎn)在turbo c中可以驗(yàn)證。

指針的大小和機(jī)器的位數(shù)有關(guān),在32位機(jī)器上任何類型指針的大小都是4字節(jié),在64位機(jī)器上為8。所以指針大小和類型無關(guān)
void*就是空類型指針,所謂空類型指針就是通用指針類型。它有以下特點(diǎn)。
1、按照ASC碼標(biāo)準(zhǔn)void指針不能做算術(shù)操作,因?yàn)椴淮_定其指向數(shù)據(jù)類型大小;
2、c++允許將任何類型的指針賦給void*,但是不允許void指針賦值給其它類型。必須顯示的強(qiáng)制轉(zhuǎn)換。

其它類型指針相互之間是否也可以強(qiáng)制裝換?
   強(qiáng)制轉(zhuǎn)換后編譯能通過,大部分情況下運(yùn)行也是沒有問題的,但是根據(jù)參考文獻(xiàn)[4]的說法是容易出問題的,因?yàn)槟承〤PU對(duì)某些數(shù)據(jù)類型有對(duì)其限制,這樣在做指針強(qiáng)制轉(zhuǎn)換的時(shí)候就容易出現(xiàn)問題。
   其實(shí),其它類型指針之間的轉(zhuǎn)換完全可以通過使用void*類型來避免。

sizeof[2]:

前面說在同一臺(tái)機(jī)器上指針大小是固定的,通過sizeof測(cè)試int*,char*,bool*,double*都出結(jié)果都是4(32位機(jī)器測(cè)試)。
今天在程序中memset一個(gè)T*類型的指針,發(fā)現(xiàn)沒有初始化成功,原來在memset的第三個(gè)參數(shù)中填的是sizeof(T*類型的指針)。特此總結(jié)了一下sizeof的一些問題。
1、char* s="0123456789";
      sizeof(s)=4,s是一個(gè)指針。
      sizeof(*s)=1,*s是第一個(gè)元素。
      strlen(s)=10,s是字符串首地址。
2、char s[]="0123456789";
      sizeof(s)=11,s是字符串?dāng)?shù)組,包括'\0'。
      sizeof(*s)=1,*s是第一個(gè)元素。
      strlen(s)=10,s是字符串首地址。
3、char s[20]="0123456789";
      sizeof(s)=20,s是在內(nèi)存中靜態(tài)分配的大小。
      sizeof(*s)=1,*s是第一個(gè)元素。
      strlen(s)=10,s是字符串首地址。

結(jié)構(gòu)體[3]:

結(jié)構(gòu)體在字節(jié)對(duì)齊的時(shí)候有三個(gè)原則,有了這三個(gè)原則就很容易的可以計(jì)算出任意一個(gè)結(jié)構(gòu)體的sizeof大小了。
1、結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型的成員大小所整除;
2、結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);
3、結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailing padding)。

參考文獻(xiàn):
[1]、http://blog.sina.com.cn/s/blog_625cce080100kip3.html
[2]、http://shansun123.iteye.com/blog/398601 
[3]、http://blog.csdn.net/Linux_Gao/article/details/2612885 
[4]、http://blog.csdn.net/Linux_Gao/article/details/2612885

]]>
device network eth0 does not seem to be presenthttp://www.shnenglu.com/syhd142/archive/2011/07/02/149968.htmlFuckerFuckerSat, 02 Jul 2011 03:25:00 GMThttp://www.shnenglu.com/syhd142/archive/2011/07/02/149968.htmlhttp://www.shnenglu.com/syhd142/comments/149968.htmlhttp://www.shnenglu.com/syhd142/archive/2011/07/02/149968.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/149968.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/149968.html今天虛擬機(jī)啟動(dòng)后網(wǎng)卡eth0啟動(dòng)不了,ifconfig -a時(shí)有一個(gè)eth10,而在/etc/sysconfig/network-scripts里面只有ifcfg-eth0,這樣網(wǎng)卡啟動(dòng)時(shí)就找不到對(duì)應(yīng)的配置文件,所以將eth10改成eth0就好了。命令如下:
ifconfig eth10 down
ip link set eth10 name eth0
ifconfig eth0 up

]]>
[轉(zhuǎn)] warning: deprecated conversion from string constant to "char *"http://www.shnenglu.com/syhd142/archive/2011/02/13/139993.htmlFuckerFuckerSun, 13 Feb 2011 13:48:00 GMThttp://www.shnenglu.com/syhd142/archive/2011/02/13/139993.htmlhttp://www.shnenglu.com/syhd142/comments/139993.htmlhttp://www.shnenglu.com/syhd142/archive/2011/02/13/139993.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/139993.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/139993.html

今天碰到了這個(gè)警告,老老實(shí)實(shí)的google了一下,以下是收獲:

問題是這樣產(chǎn)生的,先看這個(gè)函數(shù)原型:

void someFunc(char *someStr);

再看這個(gè)函數(shù)調(diào)用:

someFunc("I'm a string!");

把這兩個(gè)東西組合起來,用最新的g++編譯一下就會(huì)得到標(biāo)題中的警告。

為什么呢?原來char *背后的含義是:給我個(gè)字符串,我要修改它。
而理論上,我們傳給函數(shù)的字面常量是沒法被修改的。
所以說,比較和理的辦法是把參數(shù)類型修改為const char *。
這個(gè)類型說背后的含義是:給我個(gè)字符串,我只要讀取它。

很自然的延伸一下。 如果我既要傳字面常量又要傳字符串變量怎么辦呢?......重載



]]>
[轉(zhuǎn)]string,string.h,cstring.h的區(qū)別http://www.shnenglu.com/syhd142/archive/2011/02/13/139957.htmlFuckerFuckerSat, 12 Feb 2011 16:49:00 GMThttp://www.shnenglu.com/syhd142/archive/2011/02/13/139957.htmlhttp://www.shnenglu.com/syhd142/comments/139957.htmlhttp://www.shnenglu.com/syhd142/archive/2011/02/13/139957.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/139957.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/139957.html原文地址;http://topic.csdn.net/u/20070402/18/7111613b-c5e4-485e-a5d0-33de9aebbaea.html
c++中 string與string.h 的作用和區(qū)別
#include <string.h>   
 
void main()   
{   
  string aaa= "abcsd d";   
  printf("looking for abc from abcdecd %s\n",   
  (strcmp(aaa,"abc")) ? "Found" : "Not Found");   
 
}   
不能正確執(zhí)行,提示說是string類型沒有定義   
而下面:   
#include <string>   
 
using namespace std;   
void main()   
{   
  string aaa= "abcsd d";   
  printf("looking for abc from abcdecd %s\n",   
  (strcmp(aaa,"abc")) ? "Found" : "Not Found");   
}   
這里的string編譯器就認(rèn)識(shí)了,但是strcmp就不認(rèn)識(shí)了呢?   
一般一個(gè)C++的老的帶“.h”擴(kuò)展名的庫(kù)文件,比如iostream.h,在新標(biāo)準(zhǔn)后的標(biāo)準(zhǔn)庫(kù)中都有一個(gè)不帶“.h”擴(kuò)展名的相對(duì)應(yīng),區(qū)別除了后者的好多改進(jìn)之外,還有一點(diǎn)就是后者的東東都塞進(jìn)了“std”名字空間中。   
 
但唯獨(dú)string特別。   
問題在于C++要兼容C的標(biāo)準(zhǔn)庫(kù),而C的標(biāo)準(zhǔn)庫(kù)里碰巧也已經(jīng)有一個(gè)名字叫做“string.h”的頭文件,包含一些常用的C字符串處理函數(shù),比如樓主提到的strcmp。   
這個(gè)頭文件跟C++的string類半點(diǎn)關(guān)系也沒有,所以<string>并非<string.h>的“升級(jí)版本”,他們是毫無關(guān)系的兩個(gè)頭文件。   
要達(dá)到樓主的目的,比如同時(shí):   
#include <string.h>   
#include <string>   
using namespace std;   
或者   
#include <cstring>   
#include <string>   
 
其中<cstring>是與C標(biāo)準(zhǔn)庫(kù)的<string.h>相對(duì)應(yīng),但裹有std名字空間的版本。
笑談(來自高質(zhì)量++)
C++標(biāo)準(zhǔn)庫(kù)很大。非常大。難以置信的大。怎么個(gè)大法?這么說吧:在C++標(biāo)準(zhǔn)中,關(guān)于標(biāo)準(zhǔn)庫(kù)的規(guī)格說明占了密密麻麻300 多頁(yè),這還不包括標(biāo)準(zhǔn)C 庫(kù),后者只是"作為參考"(老實(shí)說,原文就是用的這個(gè)詞)包含在C++庫(kù)中。當(dāng)然,并非總是越大越好,但在現(xiàn)在的情況下,確實(shí)越大越好,因?yàn)榇蟮?/span>庫(kù)會(huì)包含大量的功能。標(biāo)準(zhǔn)庫(kù)中的功能越多,開發(fā)自己的應(yīng)用程序時(shí)能借助的功能就越多。C++庫(kù)并非提供了一切(很明顯的是,沒有提供并發(fā)和圖形用戶接口的支持),但確實(shí)提供了很多。幾乎任何事你都可以求助于它。在歸納標(biāo)準(zhǔn)庫(kù)中有些什么之前,需要介紹一下它是如何組織的。因?yàn)闃?biāo)準(zhǔn)庫(kù)中東西如此之多,你(或象你一樣的其他什么人)所選擇的類名或函數(shù)名就很有可能和標(biāo)準(zhǔn)庫(kù)中的某個(gè)名字相同。為了避免這種情況所造成的名字沖突,實(shí)際上標(biāo)準(zhǔn)庫(kù)中的一切都被放在名字空間std 中(參見條款28)。但這帶來了一個(gè)新問題。無數(shù)現(xiàn)有的C++代碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫(kù)中的功能,例如,聲明在<iostream.h>,<complex.h>,<limits.h>等頭文件中的功能。現(xiàn)有軟件沒有針對(duì)使用名字空間而進(jìn)行設(shè)計(jì),如果用std 來包裝標(biāo)準(zhǔn)庫(kù)導(dǎo)致現(xiàn)有代碼不能用,將是一種可恥行為。(這種釜底抽薪的做法會(huì)讓現(xiàn)有代碼的程序員說出比"可恥" 更難聽的話)懾于被激怒的程序員會(huì)產(chǎn)生的破壞力,標(biāo)準(zhǔn)委員會(huì)決定為包裝了std 的那部分標(biāo)準(zhǔn)庫(kù)構(gòu)件創(chuàng)建新的頭文件名。生成新頭文件的方法僅僅是將現(xiàn)有C++頭文件名中的.h 去掉,方法本身不重要,正如最后產(chǎn)生的結(jié)果不一致也并不重要一樣。所以<iostream.h>變成了<iostream>,<complex.h>變成了<complex>,等等。對(duì)于C 頭文件,采用同樣的方法,但在每個(gè)名字前還要添加一個(gè)c。所以C 的<string.h>變成了<cstring>,<stdio.h>變成了<cstdio>,等等。最后一點(diǎn)是,舊的C++頭文件是官方所反對(duì)使用的(即,明確列出不再支持),但舊的C 頭文件則沒有(以保持對(duì)C 的兼容性)。實(shí)際上,編譯器制造商不會(huì)停止對(duì)客戶現(xiàn)有軟件提供支持,所以可以預(yù)計(jì),舊的C++頭文件在未來幾年內(nèi)還是會(huì)被支持。所以,實(shí)際來說,下面是C++頭文件的現(xiàn)狀:舊的C++頭文件名如<iostream.h>將會(huì)繼續(xù)被支持,盡管它們不在官方標(biāo)
準(zhǔn)中。這些頭文件的內(nèi)容不在名字空間std 中。新的C++頭文件如<iostream>包含的基本功能和對(duì)應(yīng)的舊頭文件相同,但頭文件的內(nèi)容在名字空間std 中。(在標(biāo)準(zhǔn)化的過程中,庫(kù)中有些部分的細(xì)節(jié)被修改了,所以舊頭文件和新頭文件中的實(shí)體不一定完全對(duì)應(yīng)。)標(biāo)準(zhǔn)C 頭文件如<stdio.h>繼續(xù)被支持。頭文件的內(nèi)容不在std 中。
具有C 庫(kù)功能的新C++頭文件具有如<cstdio>這樣的名字。它們提供的內(nèi)容和相應(yīng)的舊C 頭文件相同,只是內(nèi)容在std 中。所有這些初看有點(diǎn)怪,但不難習(xí)慣它。最大的挑戰(zhàn)是把字符串頭文件理清楚:<string.h>是舊的C 頭文件,對(duì)應(yīng)的是基于char*的字符串處理函數(shù);<string>是包裝了std 的C++頭文件,對(duì)應(yīng)的是新的string 類(看下文);<cstring>是對(duì)應(yīng)于舊C 頭文件的std 版本。如果能掌握這些(我相信你能),其余的也就容易了。


]]>
Cache Coherence的問題http://www.shnenglu.com/syhd142/archive/2011/02/05/139739.htmlFuckerFuckerSat, 05 Feb 2011 07:54:00 GMThttp://www.shnenglu.com/syhd142/archive/2011/02/05/139739.htmlhttp://www.shnenglu.com/syhd142/comments/139739.htmlhttp://www.shnenglu.com/syhd142/archive/2011/02/05/139739.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/139739.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/139739.html自己寫論文的時(shí)候,引用了一篇SIGCOM的文獻(xiàn),里面有談到Cache Coherency(緩存一致性)和False Shareing(偽共享)的問題。那么什么是緩存一致性呢?這個(gè)問題困擾了我很久,今天在網(wǎng)上看博文的時(shí)候發(fā)現(xiàn)很詳細(xì)的解釋了這個(gè)問題,這也解決了我心中的困惑。

緩存一致性(Cache Coherency):我們現(xiàn)有的CPU的Cache是有多層結(jié)構(gòu)的,一般每個(gè)CPU會(huì)有一個(gè)私有的L1和L2級(jí)Cache,然后多個(gè)核心CPU共享一個(gè)L3級(jí)緩存。但是這樣一來有個(gè)問題,就是多個(gè)CPU的私有Cache之間需要同步。比如說,CPU1上的線程對(duì)全局變量global_counter進(jìn)行了加1操作,這個(gè)被寫入的新值存到CPU1的私有緩存里,而CPU2上的線程想要讀global_counter的時(shí)候,而CPU2的私有Cache里的global_counter的值還是舊值,怎么辦呢?這個(gè)任務(wù)就交給Cache Coherency來完成了。Cache Coherency是一種Cache之間的同步協(xié)議,它其實(shí)就是保證對(duì)某一個(gè)地址的讀操作返回的的值一定是那個(gè)地址的最新值,而這個(gè)值可能是該線程所處CPU寫的,也肯能是另外一個(gè)CPU上的線程寫的。

問題到這里看起來似乎得到了圓滿的解決,但是當(dāng)多個(gè)CPU對(duì)同一內(nèi)存地址線上的不同數(shù)據(jù)進(jìn)行操作時(shí),Cache Coherency機(jī)制會(huì)將整個(gè)地址線上的數(shù)據(jù)拷貝到各個(gè)CPU的私有Cache中去了,這樣每個(gè)線程在讀取自己數(shù)據(jù)的時(shí)候也把別人的數(shù)據(jù)讀進(jìn)去了,更新的時(shí)候Cache Coherency為了保持?jǐn)?shù)據(jù)的一致性,不同CPU的Cache之間要進(jìn)行同步,這個(gè)會(huì)導(dǎo)致嚴(yán)重的性能問題,即所謂的False Shareing,在維基百科上給出了詳細(xì)的解釋。解決方案很簡(jiǎn)單,說是通過把每個(gè)數(shù)據(jù)湊齊Cache Line的長(zhǎng)度,實(shí)現(xiàn)隔離。

參考文獻(xiàn):
[1] Wiki:Cache Coherency
[2] Wiki:False Shareing
[3] False sharing問題及其解決方法
[4] 為什么程序員需要關(guān)心順序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence?)

]]>
[轉(zhuǎn)] 文本文件和二進(jìn)制文件有什么區(qū)別?http://www.shnenglu.com/syhd142/archive/2010/12/29/137695.htmlFuckerFuckerWed, 29 Dec 2010 13:46:00 GMThttp://www.shnenglu.com/syhd142/archive/2010/12/29/137695.htmlhttp://www.shnenglu.com/syhd142/comments/137695.htmlhttp://www.shnenglu.com/syhd142/archive/2010/12/29/137695.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/137695.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/137695.html二進(jìn)制文件,這個(gè)再基礎(chǔ)不過的名詞,正因?yàn)樗臒o處不在,或許沒有人會(huì)關(guān)注它背后隱含的內(nèi)容。其實(shí)我也一樣,在寫下

這些文字之前,我也是認(rèn)為二進(jìn)制文件就像空氣一樣,平常得讓人完全忽略了。
        很偶然的,今天在寫代碼的時(shí)候使用了fopen函數(shù):
                 FILE * fopen (const char * filename, const char * mode)
大家可以看到第二個(gè)參數(shù)是mode,而這個(gè)參數(shù)定義了文件打開的方式,w、a等都可以做為函數(shù)的實(shí)參。除此之外,還有兩個(gè)值:t和

b。這兩個(gè)值定義了文件是按照文本(text)還是二進(jìn)制(binary)方式開發(fā)。正是這個(gè)兩個(gè)值引起了我對(duì)二進(jìn)制文件的興趣,因?yàn)樗鼈?/p>

讓我想到了很多問題。
        首先,出現(xiàn)在腦海的第一個(gè)問題是:文本文件和二進(jìn)制文件有什么區(qū)別呢?我想這個(gè)問題并不是每個(gè)程序員能夠馬上回答

上來的,至少我是不行了。查閱了資料之后,發(fā)現(xiàn)答案就在自己的知識(shí)范圍之內(nèi)的:將文件看作是由一個(gè)一個(gè)字節(jié)(byte) 組成的,

那么文本文件中的每個(gè)字節(jié)的最高位都是0,也就是說文本文件使用了一個(gè)字節(jié)中的七位來表示所有的信息,而二進(jìn)制文件則是將字

節(jié)中的所有位都用上了。這就是兩者的區(qū)別;
        接著,第二個(gè)問題就是文件按照文本方式或者二進(jìn)制方式打開,兩者會(huì)有什么不同呢?其實(shí)不管是二進(jìn)制文件也好,還是

文本文件也好,都是一連串的0和1,但是打開方式不同,對(duì)于這些0和1的處理也就不同。如果按照文本方式打開,在打開的時(shí)候會(huì)

進(jìn)行translate,將每個(gè)字節(jié)轉(zhuǎn)換成ASCII碼,而以按照二進(jìn)制方式打開的話,則不會(huì)進(jìn)行任何的translate;
        最后就是文本文件和二進(jìn)制文件在編輯的時(shí)候,使用的方式也是不同的。譬如,你在記事本中進(jìn)行文本編輯的時(shí)候,你進(jìn)

行編輯的最小單位是字節(jié)(byte);而對(duì)二進(jìn)制文件進(jìn)行編輯的話,最小單位則是位(bit),當(dāng)然我們都不會(huì)直接通過手工的方式對(duì)二

進(jìn)制文件進(jìn)行編輯了。

----------------2---------------


二進(jìn)制文件和文本文件都是0,1組成,但文件系統(tǒng)對(duì)他們的解釋不一樣,一般系統(tǒng)調(diào)用(或WIN32API)都會(huì)分為字符
式和二進(jìn)制式(或流式).文本或字符文件代表慢速設(shè)備,而二進(jìn)制文件代表可以大塊數(shù)據(jù)操作的快速外設(shè),二進(jìn)制文件內(nèi)容基本無意義

,系統(tǒng)對(duì)它不加解釋地傳給調(diào)用者,解釋由調(diào)用者負(fù)責(zé).而對(duì)字符文件,系統(tǒng)把他理解為單字節(jié)的ASCII或多字節(jié)的UNICODE字符串,并且

對(duì)其中的特殊字符(如回車等)加以特殊處理.所以同一個(gè)文件,可以使用不同類型的系統(tǒng)調(diào)用.

文本文件也叫做ASCII碼文件,與以‘文本方式’打開文件不是同一個(gè)概念!文本文件存儲(chǔ)的是ASSCII碼字符,即存儲(chǔ)在磁盤上只占用二進(jìn)制的0x20--0x7e。另外,還有回車(0x0d),換行(0x0a),TAB(0x09)等,所以有可壓縮的空間。

    換行和回車是不同的,而且在不同的操作系統(tǒng),解釋也不相同。‘\n’一般會(huì)操作系統(tǒng)被翻譯成"行的結(jié)束",即LF(Line-Feed);‘\r’會(huì)被翻譯成"回車",即CR(Cariage-Return)

    回車(CR)和換行(LF)符都是用來表示“下一行”的。而標(biāo)準(zhǔn)沒有規(guī)定要使用哪一個(gè)。于是產(chǎn)生了三種不同的用法:
(1) Dos和windows采用回車+換行(CR+LG)表示下一行
(2) UNIX采用換行符(LF)表示下一行
(3) MAC機(jī)采用回車符(CR)表示下一行。
當(dāng)在不同的系統(tǒng)間傳遞文件,就要涉及格式的轉(zhuǎn)換。

    文本方式和二進(jìn)制方式的最大區(qū)別在于文本方式對(duì)于'\n'換行符的理解不同
(1)在DOS平臺(tái)下,該字符會(huì)被展開成<CR>< LF>兩個(gè)控制字符(相當(dāng)于"\r\n"),在ASCII字符集下是 0DH,0AH
(2)在UNIX平臺(tái)下,僅僅是<LF>,不會(huì)展開。
(3)在二進(jìn)制方式下,不管是什么平臺(tái),'\n'都是精確的<LF>。

   在linux/unix 系統(tǒng)上,只有一種文件類型的系統(tǒng),帶b字母的模式和對(duì)應(yīng)的不帶b字母的模式是相同的。(UNIX文本文件通常不包含Ctrl+Z和\r)
關(guān)于EOF:
    EOF可以作為文本文件的結(jié)束標(biāo)志,但不能作為二進(jìn)制文件的結(jié)束符.feof函數(shù)既可以判斷二進(jìn)制文件,又可以判斷文本文件.

    EOF在Windows下是ctrl+z,linux下是ctrl+D.



]]>
[轉(zhuǎn)] sudo apt-get 和dpkg命令大全http://www.shnenglu.com/syhd142/archive/2010/12/29/137662.htmlFuckerFuckerWed, 29 Dec 2010 05:54:00 GMThttp://www.shnenglu.com/syhd142/archive/2010/12/29/137662.htmlhttp://www.shnenglu.com/syhd142/comments/137662.htmlhttp://www.shnenglu.com/syhd142/archive/2010/12/29/137662.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/137662.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/137662.html
注:找不到出處了,所以就沒表明源地址。
一、APT的使用(Ubuntu Linux軟件包管理工具一)
apt-cache search # ------(package 搜索包)
apt-cache show #------(package 獲取包的相關(guān)信息,如說明、大小、版本等)
sudo apt-get install # ------(package 安裝包)
sudo apt-get install # -----(package - - reinstall 重新安裝包)
sudo apt-get -f install # -----(強(qiáng)制安裝?#"-f = --fix-missing"當(dāng)是修復(fù)安
裝吧...)
sudo apt-get remove #-----(package 刪除包)
sudo apt-get remove - - purge # ------(package 刪除包,包括刪除配置文件
等)
sudo apt-get autoremove --purge # ----(package 刪除包及其依賴的軟件包+配置文件等(只對(duì)6.10有效,強(qiáng)烈推薦))
sudo apt-get update #------更新源
sudo apt-get upgrade #------更新已安裝的包
sudo apt-get dist-upgrade # ---------升級(jí)系統(tǒng)
sudo apt-get dselect-upgrade #------使用 dselect 升級(jí)
apt-cache depends #-------(package 了解使用依賴)
apt-cache rdepends # ------(package 了解某個(gè)具體的依賴?#當(dāng)是查看該包被哪些包依賴吧...)
sudo apt-get build-dep # ------(package 安裝相關(guān)的編譯環(huán)境)
apt-get source #------(package 下載該包的源代碼)
sudo apt-get clean && sudo apt-get autoclean # --------清理下載文件的存
檔 && 只清理過時(shí)的包
sudo apt-get check #-------檢查是否有損壞的依賴

apt-get install 的用法
apt-get install <package>
下載 <package> 以及所有倚賴的包裹,同時(shí)進(jìn)行包裹的安裝或升級(jí).如果某個(gè)包裹被設(shè)置了 hold (停止標(biāo)志,就會(huì)被擱在一邊(即不會(huì)被升級(jí)).更多 hold 細(xì)節(jié)請(qǐng)看下面.

apt-get remove [--purge] <package>
移除 <package> 以及任何倚賴這個(gè)包裹的其它包裹.--purge 指明這個(gè)包裹應(yīng)該被完全清除 (purged) ,更多信息請(qǐng)看 dpkg -P .

apt-get update
升級(jí)來自 Debian 鏡像的包裹列表,如果你想安裝當(dāng)天的任何軟件,至少每天運(yùn)行一次,而且每次修改了
/etc/apt/sources.list 后,必須執(zhí)行.

apt-get upgrade [-u]
升 級(jí)所以已經(jīng)安裝的包裹為最新可用版本.不會(huì)安裝新的或移除老的包裹.如果一個(gè)包改變了倚賴關(guān)系而需要安裝一個(gè)新的包裹,那么它將不會(huì)被升級(jí),而是標(biāo)志為 hold .apt-get update 不會(huì)升級(jí)被標(biāo)志為 hold 的包裹 (這個(gè)也就是 hold 的意思).請(qǐng)看下文如何手動(dòng)設(shè)置包裹為 hold .我建議同時(shí)使用 '-u' 選項(xiàng),因?yàn)檫@樣你就能看到哪些包裹將會(huì)被升級(jí).

apt-get dist-upgrade [-u]
和 apt-get upgrade 類似,除了 dist-upgrade 會(huì)安裝和移除包裹來滿足倚賴關(guān)系.因此具有一定的危險(xiǎn)性.

apt-cache search <pattern>
搜索滿足 <pattern> 的包裹和描述.

apt-cache show <package>
顯示 <package> 的完整的描述.

apt-cache showpkg <package>
顯示 <package> 許多細(xì)節(jié),以及和其它包裹的關(guān)系.

dselect, console-apt, aptitude, gnome-apt,是APT 的幾個(gè)圖形前端(其中一些在使用前得先安裝).這里 dselect 無疑是最強(qiáng)大的,也是最古老,最難駕馭.

-------------------------------------

二、 DPKG的 用法(Ubuntu Linux軟件包管理工具二)
dpkg -i <package.deb>
安裝一個(gè) Debian 包裹文件;如你手動(dòng)下載的文件.

dpkg -c <package.deb>
列出 <package.deb> 的內(nèi)容.

dpkg -I <package.deb>
從 <package.deb> 中提取包裹信息.

dpkg -r <package>
移除一個(gè)已安裝的包裹.

dpkg -P <package>
完全清除一個(gè)已安裝的包裹.和 remove 不同的是, remove 只是刪掉數(shù)據(jù)和可執(zhí)行
文件, purge 另外還刪除所有的配制文件.

dpkg -L <package>
列出 <package> 安裝的所有文件清單.同時(shí)請(qǐng)看 dpkg -c 來檢查一個(gè) .deb 文件
的內(nèi)容.

dpkg -s <package>
顯示已安裝包裹的信息.同時(shí)請(qǐng)看 apt-cache 顯示 Debian 存檔中的包裹信息,以
及 dpkg -I 來顯示從一個(gè)
.deb 文件中提取的包裹信息.

dpkg-reconfigure <package>
重新配制一個(gè)已經(jīng)安裝的包裹,如果它使用的是 debconf (debconf 為包裹安裝提
供了一個(gè)統(tǒng)一的配制界面).你能夠重新配制 debconf 它本身,如你想改變它的前端
或提問的優(yōu)先權(quán).例如,重新配制 debconf ,使用一個(gè) dialog 前端,簡(jiǎn)單運(yùn)行:

dpkg-reconfigure --frontend=dialog debconf (如果你安裝時(shí)選錯(cuò)了,這里可以
改回來喲

echo "<package> hold" | dpkg --set-selections
設(shè)置 <package> 的狀態(tài)為 hlod (命令行方式)

dpkg --get-selections "<package>"
取的 <package> 的當(dāng)前狀態(tài) (命令行方式)

支持通配符,如:
Debian:~# dpkg --get-selections *wine*

備注:

-------------------------------------例如:
大家現(xiàn)在用的都是 gaim-0.58 + QQ-plugin,為了防止 gaim 被升級(jí),我們可以采用
如下方法:

方法一:
Debian:~# echo "gaim hold" | dpkg --set-selections
然后用下面命令檢查一下:
Debian:~# dpkg --get-selections "gaim"
gaim hold
現(xiàn)在的狀態(tài)標(biāo)志是 hold,就不能被升級(jí)了.

如果想恢復(fù)怎么辦呢?
Debian:~# echo "gaim install" | dpkg --set-selections
Debian:~# dpkg --get-selections "gaim"
gaim install
這時(shí)狀態(tài)標(biāo)志又被重置為 install,可以繼續(xù)升級(jí)了.

同志們會(huì)問,哪個(gè)這些狀態(tài)標(biāo)志都寫在哪個(gè)文件中呢?
在 /var/lib/dpkg/status 里,你也可以通過修改這個(gè)文件實(shí)現(xiàn) hold.

有時(shí)你會(huì)發(fā)現(xiàn)有的軟件狀態(tài)標(biāo)志是 purge,不要奇怪.
如:事先已經(jīng)安裝了 amsn, 然后把它卸了.
apt-get remove --purge amsn
那么狀態(tài)標(biāo)志就從 install 變成 purge.

方法二:
在/etc/apt 下手動(dòng)建一個(gè) preferences 文件
內(nèi)容:
Package: gaim
Pin: version 0.58*
保存
更詳細(xì)內(nèi)容請(qǐng)看:
http://linuxsir.com/bbs/showthread....&threadid=22601

dpkg -S <file>
在包裹數(shù)據(jù)庫(kù)中查找 <file>,并告訴你哪個(gè)包裹包含了這個(gè)文件.(注:查找的是事
先已經(jīng)安裝的包裹)

從源碼建立deb packages

apt-get source [-b] <package>
下載一個(gè)源碼的包并解開。
你必須在你的/etc/apt/sources.list文件里寫入一條 deb-src 的記錄才能完成這
項(xiàng)工作。
如果你輸入了一個(gè)-b參數(shù),并且是以root的身份,deb包會(huì)被自動(dòng)的創(chuàng)建。

apt-get build-dep <package>
自動(dòng)下載并安裝通過源碼創(chuàng)建 <package> 時(shí)需要的包。
只有apt 0.5以上版本才支持這個(gè)功能。
現(xiàn)在woody和以上版本包含了這個(gè)功能。
如果你使有一個(gè)舊版本的apt,查找依賴性最簡(jiǎn)單的方法是查看源碼包中
debian/control 這個(gè)文件,
注意這個(gè)路徑是相對(duì)的,是包內(nèi)的路徑。

普通的用法,結(jié)合 apt-get source -b,例子 (as root):

apt-get build-dep <package>
apt-get source -b <package>

會(huì)下載源碼包,建立依賴性,然后嘗試編譯源碼。

dpkg-source -x <package.dsc>
如果你手工下載了一個(gè)程序的源碼包,其中包含了幾個(gè)類
似 .orig.tar.gz , .dsc ,
以及 .diff.gz 之類的文件,
那么你就可以對(duì) .dsc 文件使用這個(gè)命令來 unpack 源碼包。

dpkg-buildpackage
從 Debian 源碼樹建立一個(gè)deb包。你必須在source tree的主目錄才能生效。例
如:

dpkg-buildpackage -rfakeroot -uc -b

這里 '-rfakeroot' 指定命令使用 fakeroot 程序來模仿 root 權(quán)限 (來實(shí)現(xiàn)所有
者(ownership)目的),
'-uc' 表示 "Don't cryptographically sign the changelog", '-b' 代表只建立
二進(jìn)制包.

debuild
一個(gè)快速打包腳本類似 dpkg-buildpackage ,能自動(dòng)的識(shí)別是否使用 fakeroot,
同時(shí)為你運(yùn)行 lintian 和 gpg

修正倚賴關(guān)系

dpkg --configure --pending
如果dpkg在apt-get install upgrade dist-uptradeing 的時(shí)候出錯(cuò)退出,
嘗試使用此命令來配置已經(jīng)unpack的包。
然后再用 apt-get install ,upgrade, or dist-upgrade -f ,
然后再用 apt-get install, upgrade, or dist-upgrade.

可能會(huì)重復(fù)多次,這樣通常可以解決大多數(shù)的依賴性問題。
(同時(shí),如果提示由于某種原因需要某個(gè)特定的包裹,你可以常識(shí)安裝或卸載這個(gè)包)

apt-get install -f
apt-get upgrade -f
apt-get dist-upgrade -f
嘗試修正上述過程中出現(xiàn)依賴性關(guān)系
注意 apt-get install -f 不需要 <package> 作為參數(shù)。

-------------------------------------
用apt-cdrom -d /media/cdrom0 add 加載光驅(qū),

/dev/hdc /cdrom iso9660 user,noauto 0 0
用編輯器修改一下存盤,重啟,應(yīng)該可以了。
然后,apt-cdrom -d /cdrom add
apt-get install (你要裝的軟件名:《例如gcc》)
gcc相關(guān)的軟件會(huì)自動(dòng)裝入。
昨天,剛試過,很爽。
注意:apt不會(huì)認(rèn)你手動(dòng)掛載的光驅(qū),如果fstab中設(shè)置不對(duì)apt不會(huì)正常工作。

用apt-cdrom -d /media/cdrom0 add 加載光驅(qū),
需要使用#mkdir /media/cdrom0 否則會(huì)錯(cuò)誤提示說“無法讀取文件系統(tǒng)掛載
點(diǎn)/media/cdrom的狀態(tài) -stat(2 沒有那個(gè)文件或目錄)”


]]>
[轉(zhuǎn)] Ubuntu 軟件包管理詳解http://www.shnenglu.com/syhd142/archive/2010/12/29/137659.htmlFuckerFuckerWed, 29 Dec 2010 05:09:00 GMThttp://www.shnenglu.com/syhd142/archive/2010/12/29/137659.htmlhttp://www.shnenglu.com/syhd142/comments/137659.htmlhttp://www.shnenglu.com/syhd142/archive/2010/12/29/137659.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/137659.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/137659.html

原地址:http://www.shnenglu.com/jb8164/archive/2009/01/09/71583.html

Ubuntu 方便宜用,最值得讓人稱道的便是其安裝軟件的方式, 一條命令: sudo apt-get install xxx 就幾乎能幫你搞定所有的軟件安裝難題。但是有時(shí)你可能有這樣的需求,查看某個(gè)軟件包是否安裝、安裝在哪..., 那我們就來介紹一下 Ubuntu 的軟件包管理方式。

一、Ubuntu 采用 Debian 的軟件包管理器 dpkg 來管理軟件包, 類似 RPM. 系統(tǒng)中所有 packages 的信息都在 /var/lib/dpkg/
目錄下, 其子目錄 /var/lib/dpkg/info 用于保存各個(gè)軟件包的配置文件列表:
 (1).conffiles 記錄了軟件包的配置文件列表
 (2).list 保存軟件包中的文件列表, 用戶可以從 .list 的信息中找到軟件包中文件的具體安裝位置.
 (3).md5sums 記錄了軟件包的md5信息, 這個(gè)信息是用來進(jìn)行包驗(yàn)證的.
 (4).prerm 腳本在 Debian 包解包之前運(yùn)行, 主要作用是停止作用于即將升級(jí)的軟件包的服務(wù), 直到軟件包安裝或升級(jí)完成.
 (5).postinst 腳本是完成 Debian 包解開之后的配置工作, 通常用于執(zhí)行所安裝軟件包相關(guān)命令和服務(wù)重新啟動(dòng).

/var/lib/dpkg/available 文件的內(nèi)容是軟件包的描述信息, 該軟件包括當(dāng)前系統(tǒng)所使用的 Debian 安裝源中的所有軟件包,
其中包括當(dāng)前系統(tǒng)中已安裝的和未安裝的軟件包.

/var/cache/apt/archives 目錄是在用 apt-get install 安裝軟件時(shí),軟件包的臨時(shí)存放路徑

/etc/apt/sources.list 存放的是軟件源站點(diǎn), 當(dāng)你執(zhí)行 sudo apt-get install xxx 時(shí),Ubuntu 就去這些站點(diǎn)下載軟件包到本地并執(zhí)行安裝

二、相關(guān)命令使用示例:
 (1)查看某軟件包的安裝內(nèi)容
    dpkg -L xxx

 (2)查找軟件庫(kù)中的軟件包
    apt-cache search 正則表達(dá)式

 (3)顯示系統(tǒng)安裝包的統(tǒng)計(jì)信息
    apt-cache stats
 
 (4)顯示系統(tǒng)全部可用軟件包的名稱
    apt-cache pkgnames

 (5)顯示某軟件包的詳細(xì)信息
    apt-cache show xxx

 (6)查找某文件屬于哪個(gè)包
    apt-file search xxx

 (7)查看已經(jīng)安裝了哪些軟件包
    dpkg -l

 (8)查詢某軟件依賴哪些軟件包
    apt-cache depends xxx

 (9)查詢某軟件被哪些軟件包依賴
    apt-cache rdepends xxx

 (10)增加一個(gè)光盤源
    sudo apt-cdrom add
    注: 顧名思義, 就是安裝更新軟件包時(shí)讓其優(yōu)先從Ubuntu 光盤上找(如果你不能上網(wǎng)安裝/更新, 但有 Ubuntu 的 DVD ISO, 這會(huì)對(duì)你非常有用)

 (11)系統(tǒng)升級(jí)
    sudo apt-get update

 (12)清除所有已刪除軟件包的殘馀配置文件
    dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

 (13)編譯時(shí)缺少h文件的自動(dòng)處理
    sudo auto-apt run ./configure

 (14)查看安裝軟件時(shí)下載軟件包的臨時(shí)存放目錄
    ls /var/cache/apt/archives

 (15)備份當(dāng)前系統(tǒng)安裝的所有軟件包的列表
    dpkg --get-selections | grep -v deinstall > ~/somefile

 (16)從上面?zhèn)浞莸陌惭b包的列表文件恢復(fù)所有包
    dpkg --set-selections < ~/somefile
    sudo dselect

 (17)清理舊版本的軟件緩存
    sudo apt-get autoclean

 (18)清理所有軟件緩存
    sudo apt-get clean

 (19)刪除系統(tǒng)不再使用的孤立軟件
    sudo apt-get autoremove

 (20)查看軟件包在服務(wù)器上面的地址
    apt-get -qq --print-uris install ssh | cut -d\' -f2



]]>
如何去掉代碼中的行號(hào)http://www.shnenglu.com/syhd142/archive/2010/12/21/137141.htmlFuckerFuckerTue, 21 Dec 2010 13:30:00 GMThttp://www.shnenglu.com/syhd142/archive/2010/12/21/137141.htmlhttp://www.shnenglu.com/syhd142/comments/137141.htmlhttp://www.shnenglu.com/syhd142/archive/2010/12/21/137141.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/137141.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/137141.html我們?cè)趶木W(wǎng)上拷貝程序的時(shí)候有的時(shí)候會(huì)帶有行號(hào),上次記得在shell命令里面有一個(gè)按照列分割的命令,但是忘記了,今天看網(wǎng)頁(yè)的時(shí)候突然看到,于是就試了一下,發(fā)現(xiàn)可以通過pipe實(shí)現(xiàn),這個(gè)功能很好。
例,有如下代碼:
     
1    #include <stdio.h>
     
2    #include <string.h>
     
3    
     
4    
     
5    int main(int argc, char *argv[])
     
6    {
     
7        int i;
     
8        for(i = 0; i < argc; i++)
     
9        {
    
10            printf("%d argument is %s\n", i, argv[i]);
    
11        }
    
12        return 0;
    
13    }
需要去掉前面的行號(hào),當(dāng)然我們可以寫一個(gè)程序?qū)崿F(xiàn)該功能,但是這樣太麻煩,還要編譯。我們通過cut命令實(shí)現(xiàn)。
具體方法:cut 
-cstart_pos-end_pos < input_file
或者:cut 
-cstart_pos- < input_file
在上面那個(gè)例子中用cat 
-c8- < input_file就行啦。


]]>
[轉(zhuǎn)] 你知道Linux網(wǎng)絡(luò)協(xié)議棧嗎?http://www.shnenglu.com/syhd142/archive/2010/12/14/136394.htmlFuckerFuckerTue, 14 Dec 2010 09:21:00 GMThttp://www.shnenglu.com/syhd142/archive/2010/12/14/136394.htmlhttp://www.shnenglu.com/syhd142/comments/136394.htmlhttp://www.shnenglu.com/syhd142/archive/2010/12/14/136394.html#Feedback0http://www.shnenglu.com/syhd142/comments/commentRss/136394.htmlhttp://www.shnenglu.com/syhd142/services/trackbacks/136394.html原文地址:http://network.51cto.com/art/201009/227036.htm
    Linux網(wǎng)絡(luò)協(xié)議棧是我們接下來要具體分析的內(nèi)容。通過文章解析,我們能夠掌握這個(gè)概念,功能以及簡(jiǎn)單的應(yīng)用。

    Linux網(wǎng)絡(luò)協(xié)議棧跟Windows系統(tǒng)中的網(wǎng)絡(luò)協(xié)議有什么不一樣呢?這個(gè)還需要我們來看看具體的內(nèi)容。下面就來簡(jiǎn)單看看它的概念,結(jié)構(gòu)以及相應(yīng)的一些解說吧。望對(duì)大家有所幫助。

    Linux網(wǎng)絡(luò)協(xié)議棧

    Linux的協(xié)議棧其實(shí)是源于BSD的協(xié)議棧,它向上以及向下的接口以及協(xié)議棧本身的軟件分層組織的非常好。

    Linux的協(xié)議棧基于分層的設(shè)計(jì)思想,總共分為四層,從下往上依次是 :物理層,鏈路層,網(wǎng)絡(luò)層,應(yīng)用層。

    物理層主要提供各種連接的物理設(shè)備,如各種網(wǎng)卡,串口卡等;鏈路層主要指的是提供對(duì)物理層進(jìn)行訪問的各種接口卡的驅(qū)動(dòng)程序,如網(wǎng)卡驅(qū)動(dòng)等;網(wǎng)路層的作用是負(fù)責(zé)將網(wǎng)絡(luò)數(shù)據(jù)包傳輸?shù)秸_的位置,最重要的網(wǎng)絡(luò)層協(xié)議當(dāng)然就是IP協(xié)議了,其實(shí)網(wǎng)絡(luò)層還有其他的協(xié)議如ICMP,ARP,RARP等,只不過不像IP那樣被多數(shù)人所熟悉;傳輸層的作用主要是提供端到端,說白一點(diǎn)就是提供應(yīng)用程序之間的通信,傳輸層最著名的協(xié)議非TCP與UDP協(xié)議末屬了;應(yīng)用層,顧名思義,當(dāng)然就是由應(yīng)用程序提供的,用來對(duì)傳輸數(shù)據(jù)進(jìn)行語(yǔ)義解釋的“人機(jī)界面”層了,比如HTTP,SMTP,F(xiàn)TP等等,其實(shí)應(yīng)用層還不是人們最終所看到的那一層,最上面的一層應(yīng)該是“解釋層”,負(fù)責(zé)將數(shù)據(jù)以各種不同的表項(xiàng)形式最終呈獻(xiàn)到人們眼前。

    Linux網(wǎng)絡(luò)核心架構(gòu)

    Linux的網(wǎng)絡(luò)架構(gòu)從上往下可以分為三層,分別是 :

    用戶空間的應(yīng)用層。

    內(nèi)核空間的網(wǎng)絡(luò)協(xié)議棧層。

    物理硬件層。

    其中最重要最核心的當(dāng)然是內(nèi)核空間的協(xié)議棧層了。

    Linux網(wǎng)絡(luò)協(xié)議棧結(jié)構(gòu)

    Linux的整個(gè)網(wǎng)絡(luò)協(xié)議棧都構(gòu)建與Linux Kernel中,整個(gè)棧也是嚴(yán)格按照分層的思想來設(shè)計(jì)的,整個(gè)棧共分為五層,分別是 :

    1. 系統(tǒng)調(diào)用接口層,實(shí)質(zhì)是一個(gè)面向用戶空間應(yīng)用程序的接口調(diào)用庫(kù),向用戶空間應(yīng)用程序提供使用網(wǎng)絡(luò)服務(wù)的接口。

    2. 協(xié)議無關(guān)的接口層,就是SOCKET層,這一層的目的是屏蔽底層的不同協(xié)議(更準(zhǔn)確的來說主要是TCP與UDP,當(dāng)然還包括RAW IP, SCTP等),以便與系統(tǒng)調(diào)用層之間的接口可以簡(jiǎn)單,統(tǒng)一。簡(jiǎn)單的說,不管我們應(yīng)用層使用什么協(xié)議,都要通過系統(tǒng)調(diào)用接口來建立一個(gè)SOCKET,這個(gè)SOCKET其實(shí)是一個(gè)巨大的sock結(jié)構(gòu),它和下面一層的網(wǎng)絡(luò)協(xié)議層聯(lián)系起來,屏蔽了不同的網(wǎng)絡(luò)協(xié)議的不同,只吧數(shù)據(jù)部分呈獻(xiàn)給應(yīng)用層(通過系統(tǒng)調(diào)用接口來呈獻(xiàn))。

    3. 網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)層,毫無疑問,這是整個(gè)協(xié)議棧的核心。這一層主要實(shí)現(xiàn)各種網(wǎng)絡(luò)協(xié)議,最主要的當(dāng)然是IP,ICMP,ARP,RARP,TCP,UDP等。這一層包含了很多設(shè)計(jì)的技巧與算法,相當(dāng)?shù)牟诲e(cuò)。

    4. 與具體設(shè)備無關(guān)的驅(qū)動(dòng)接口層,這一層的目的主要是為了統(tǒng)一不同的接口卡的驅(qū)動(dòng)程序與網(wǎng)絡(luò)協(xié)議層的接口,它將各種不同的驅(qū)動(dòng)程序的功能統(tǒng)一抽象為幾個(gè)特殊的動(dòng)作,如open,close,init等,這一層可以屏蔽底層不同的驅(qū)動(dòng)程序。

    5. 驅(qū)動(dòng)程序?qū)樱@一層的目的就很簡(jiǎn)單了,就是建立與硬件的接口層。

    可以看到,Linux網(wǎng)絡(luò)協(xié)議棧是一個(gè)嚴(yán)格分層的結(jié)構(gòu),其中的每一層都執(zhí)行相對(duì)獨(dú)立的功能,結(jié)構(gòu)非常清晰。

    其中的兩個(gè)“無關(guān)”層的設(shè)計(jì)非常棒,通過這兩個(gè)“無關(guān)”層,其協(xié)議棧可以非常輕松的進(jìn)行擴(kuò)展。在我們自己的軟件設(shè)計(jì)中,可以吸收這種設(shè)計(jì)方法。



]]>
久久精品这里热有精品| 99久久精品无码一区二区毛片| 欧美久久亚洲精品| 中文字幕无码久久人妻| 久久久久久国产精品无码下载 | 狠狠综合久久综合88亚洲| 狠狠色婷婷久久综合频道日韩 | 久久香蕉一级毛片| 精品久久久中文字幕人妻| 99久久国产亚洲高清观看2024 | 久久精品国产清高在天天线| 久久综合欧美成人| 久久强奷乱码老熟女网站| 人妻无码久久一区二区三区免费| 99久久综合国产精品免费| 亚洲人成网站999久久久综合 | 国产精品gz久久久| 久久久久久久91精品免费观看| 国产精品9999久久久久| 国产成人无码精品久久久性色| 99久久精品国产一区二区三区| 亚洲AV无码久久精品蜜桃| 午夜精品久久久久9999高清| 91精品国产乱码久久久久久 | 久久精品九九亚洲精品| 思思久久好好热精品国产| 久久伊人影视| 久久婷婷色综合一区二区| 久久青青草原国产精品免费| 狠狠色婷婷综合天天久久丁香| 欧美午夜精品久久久久免费视| 亚洲精品成人网久久久久久| 久久久WWW成人免费精品| 草草久久久无码国产专区| 久久精品国产99国产电影网| 精品蜜臀久久久久99网站| 久久久无码精品亚洲日韩按摩 | 99久久国语露脸精品国产| 久久精品国产亚洲AV电影| 国产精品久久久久久| 久久久精品免费国产四虎|