精品久久久久久无码专区,狠狠色婷婷久久综合频道日韩,日日狠狠久久偷偷色综合0http://www.shnenglu.com/syhd142/zh-cnWed, 07 May 2025 18:25:18 GMTWed, 07 May 2025 18:25:18 GMT60c語言中有關void,sizeof,結構體的一些問題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語言中的空類型,void的用途有二。
1、對函數返回的限定;
      如果函數沒有返回值,則默認返回整數類型,而不是void類型。c++有很嚴格的類型,不允許函數不加類型聲明,而編譯器則不這么認為檢查這一點在VC6.0中可以驗證。所以在編寫代碼的時候,每個函數都應該加上返回類型。
2、對函數參數的限定;
      在c++中,函數參數為void意味著不接受參數,但是在c語言中可以給無參數的函數傳遞任意類型的參數,這點在turbo c中可以驗證。

指針的大小和機器的位數有關,在32位機器上任何類型指針的大小都是4字節,在64位機器上為8。所以指針大小和類型無關。
void*就是空類型指針,所謂空類型指針就是通用指針類型。它有以下特點。
1、按照ASC碼標準void指針不能做算術操作,因為不確定其指向數據類型大小;
2、c++允許將任何類型的指針賦給void*,但是不允許void指針賦值給其它類型。必須顯示的強制轉換。

其它類型指針相互之間是否也可以強制裝換?
   強制轉換后編譯能通過,大部分情況下運行也是沒有問題的,但是根據參考文獻[4]的說法是容易出問題的,因為某些CPU對某些數據類型有對其限制,這樣在做指針強制轉換的時候就容易出現問題。
   其實,其它類型指針之間的轉換完全可以通過使用void*類型來避免。

sizeof[2]:

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

結構體[3]:

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

參考文獻:
[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

Fucker 2011-08-24 22:48 發表評論
]]>
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今天虛擬機啟動后網卡eth0啟動不了,ifconfig -a時有一個eth10,而在/etc/sysconfig/network-scripts里面只有ifcfg-eth0,這樣網卡啟動時就找不到對應的配置文件,所以將eth10改成eth0就好了。命令如下:
ifconfig eth10 down
ip link set eth10 name eth0
ifconfig eth0 up

Fucker 2011-07-02 11:25 發表評論
]]>
[轉] 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

今天碰到了這個警告,老老實實的google了一下,以下是收獲:

問題是這樣產生的,先看這個函數原型:

void someFunc(char *someStr);

再看這個函數調用:

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

把這兩個東西組合起來,用最新的g++編譯一下就會得到標題中的警告。

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

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



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


Fucker 2011-02-13 00:49 發表評論
]]>
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自己寫論文的時候,引用了一篇SIGCOM的文獻,里面有談到Cache Coherency(緩存一致性)和False Shareing(偽共享)的問題。那么什么是緩存一致性呢?這個問題困擾了我很久,今天在網上看博文的時候發現很詳細的解釋了這個問題,這也解決了我心中的困惑。

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

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

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

Fucker 2011-02-05 15:54 發表評論
]]>
[轉] 文本文件和二進制文件有什么區別?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二進制文件,這個再基礎不過的名詞,正因為它的無處不在,或許沒有人會關注它背后隱含的內容。其實我也一樣,在寫下

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

b。這兩個值定義了文件是按照文本(text)還是二進制(binary)方式開發。正是這個兩個值引起了我對二進制文件的興趣,因為它們

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

上來的,至少我是不行了。查閱了資料之后,發現答案就在自己的知識范圍之內的:將文件看作是由一個一個字節(byte) 組成的,

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

節中的所有位都用上了。這就是兩者的區別;
        接著,第二個問題就是文件按照文本方式或者二進制方式打開,兩者會有什么不同呢?其實不管是二進制文件也好,還是

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

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

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

進制文件進行編輯了。

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


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

,系統對它不加解釋地傳給調用者,解釋由調用者負責.而對字符文件,系統把他理解為單字節的ASCII或多字節的UNICODE字符串,并且

對其中的特殊字符(如回車等)加以特殊處理.所以同一個文件,可以使用不同類型的系統調用.

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

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

    回車(CR)和換行(LF)符都是用來表示“下一行”的。而標準沒有規定要使用哪一個。于是產生了三種不同的用法:
(1) Dos和windows采用回車+換行(CR+LG)表示下一行
(2) UNIX采用換行符(LF)表示下一行
(3) MAC機采用回車符(CR)表示下一行。
當在不同的系統間傳遞文件,就要涉及格式的轉換。

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

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

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



Fucker 2010-12-29 21:46 發表評論
]]>
[轉] 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 獲取包的相關信息,如說明、大小、版本等)
sudo apt-get install # ------(package 安裝包)
sudo apt-get install # -----(package - - reinstall 重新安裝包)
sudo apt-get -f install # -----(強制安裝?#"-f = --fix-missing"當是修復安
裝吧...)
sudo apt-get remove #-----(package 刪除包)
sudo apt-get remove - - purge # ------(package 刪除包,包括刪除配置文件
等)
sudo apt-get autoremove --purge # ----(package 刪除包及其依賴的軟件包+配置文件等(只對6.10有效,強烈推薦))
sudo apt-get update #------更新源
sudo apt-get upgrade #------更新已安裝的包
sudo apt-get dist-upgrade # ---------升級系統
sudo apt-get dselect-upgrade #------使用 dselect 升級
apt-cache depends #-------(package 了解使用依賴)
apt-cache rdepends # ------(package 了解某個具體的依賴?#當是查看該包被哪些包依賴吧...)
sudo apt-get build-dep # ------(package 安裝相關的編譯環境)
apt-get source #------(package 下載該包的源代碼)
sudo apt-get clean && sudo apt-get autoclean # --------清理下載文件的存
檔 && 只清理過時的包
sudo apt-get check #-------檢查是否有損壞的依賴

apt-get install 的用法
apt-get install <package>
下載 <package> 以及所有倚賴的包裹,同時進行包裹的安裝或升級.如果某個包裹被設置了 hold (停止標志,就會被擱在一邊(即不會被升級).更多 hold 細節請看下面.

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

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

apt-get upgrade [-u]
升 級所以已經安裝的包裹為最新可用版本.不會安裝新的或移除老的包裹.如果一個包改變了倚賴關系而需要安裝一個新的包裹,那么它將不會被升級,而是標志為 hold .apt-get update 不會升級被標志為 hold 的包裹 (這個也就是 hold 的意思).請看下文如何手動設置包裹為 hold .我建議同時使用 '-u' 選項,因為這樣你就能看到哪些包裹將會被升級.

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

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

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

apt-cache showpkg <package>
顯示 <package> 許多細節,以及和其它包裹的關系.

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

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

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

dpkg -c <package.deb>
列出 <package.deb> 的內容.

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

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

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

dpkg -L <package>
列出 <package> 安裝的所有文件清單.同時請看 dpkg -c 來檢查一個 .deb 文件
的內容.

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

dpkg-reconfigure <package>
重新配制一個已經安裝的包裹,如果它使用的是 debconf (debconf 為包裹安裝提
供了一個統一的配制界面).你能夠重新配制 debconf 它本身,如你想改變它的前端
或提問的優先權.例如,重新配制 debconf ,使用一個 dialog 前端,簡單運行:

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

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

dpkg --get-selections "<package>"
取的 <package> 的當前狀態 (命令行方式)

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

備注:

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

方法一:
Debian:~# echo "gaim hold" | dpkg --set-selections
然后用下面命令檢查一下:
Debian:~# dpkg --get-selections "gaim"
gaim hold
現在的狀態標志是 hold,就不能被升級了.

如果想恢復怎么辦呢?
Debian:~# echo "gaim install" | dpkg --set-selections
Debian:~# dpkg --get-selections "gaim"
gaim install
這時狀態標志又被重置為 install,可以繼續升級了.

同志們會問,哪個這些狀態標志都寫在哪個文件中呢?
在 /var/lib/dpkg/status 里,你也可以通過修改這個文件實現 hold.

有時你會發現有的軟件狀態標志是 purge,不要奇怪.
如:事先已經安裝了 amsn, 然后把它卸了.
apt-get remove --purge amsn
那么狀態標志就從 install 變成 purge.

方法二:
在/etc/apt 下手動建一個 preferences 文件
內容:
Package: gaim
Pin: version 0.58*
保存
更詳細內容請看:
http://linuxsir.com/bbs/showthread....&threadid=22601

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

從源碼建立deb packages

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

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

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

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

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

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

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

dpkg-buildpackage -rfakeroot -uc -b

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

debuild
一個快速打包腳本類似 dpkg-buildpackage ,能自動的識別是否使用 fakeroot,
同時為你運行 lintian 和 gpg

修正倚賴關系

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

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

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

-------------------------------------
用apt-cdrom -d /media/cdrom0 add 加載光驅,

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

用apt-cdrom -d /media/cdrom0 add 加載光驅,
需要使用#mkdir /media/cdrom0 否則會錯誤提示說“無法讀取文件系統掛載
點/media/cdrom的狀態 -stat(2 沒有那個文件或目錄)”


Fucker 2010-12-29 13:54 發表評論
]]>
[轉] 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 就幾乎能幫你搞定所有的軟件安裝難題。但是有時你可能有這樣的需求,查看某個軟件包是否安裝、安裝在哪..., 那我們就來介紹一下 Ubuntu 的軟件包管理方式。

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

/var/lib/dpkg/available 文件的內容是軟件包的描述信息, 該軟件包括當前系統所使用的 Debian 安裝源中的所有軟件包,
其中包括當前系統中已安裝的和未安裝的軟件包.

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

/etc/apt/sources.list 存放的是軟件源站點, 當你執行 sudo apt-get install xxx 時,Ubuntu 就去這些站點下載軟件包到本地并執行安裝

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

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

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

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

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

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

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

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

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

 (11)系統升級
    sudo apt-get update

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

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

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

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

 (16)從上面備份的安裝包的列表文件恢復所有包
    dpkg --set-selections < ~/somefile
    sudo dselect

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

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

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

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



Fucker 2010-12-29 13:09 發表評論
]]>
如何去掉代碼中的行號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我們在從網上拷貝程序的時候有的時候會帶有行號,上次記得在shell命令里面有一個按照列分割的命令,但是忘記了,今天看網頁的時候突然看到,于是就試了一下,發現可以通過pipe實現,這個功能很好。
例,有如下代碼:
     
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    }
需要去掉前面的行號,當然我們可以寫一個程序實現該功能,但是這樣太麻煩,還要編譯。我們通過cut命令實現。
具體方法:cut 
-cstart_pos-end_pos < input_file
或者:cut 
-cstart_pos- < input_file
在上面那個例子中用cat 
-c8- < input_file就行啦。


Fucker 2010-12-21 21:30 發表評論
]]>
[轉] 你知道Linux網絡協議棧嗎?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網絡協議棧是我們接下來要具體分析的內容。通過文章解析,我們能夠掌握這個概念,功能以及簡單的應用。

    Linux網絡協議棧跟Windows系統中的網絡協議有什么不一樣呢?這個還需要我們來看看具體的內容。下面就來簡單看看它的概念,結構以及相應的一些解說吧。望對大家有所幫助。

    Linux網絡協議棧

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

    Linux的協議?;诜謱拥脑O計思想,總共分為四層,從下往上依次是 :物理層,鏈路層,網絡層,應用層。

    物理層主要提供各種連接的物理設備,如各種網卡,串口卡等;鏈路層主要指的是提供對物理層進行訪問的各種接口卡的驅動程序,如網卡驅動等;網路層的作用是負責將網絡數據包傳輸到正確的位置,最重要的網絡層協議當然就是IP協議了,其實網絡層還有其他的協議如ICMP,ARP,RARP等,只不過不像IP那樣被多數人所熟悉;傳輸層的作用主要是提供端到端,說白一點就是提供應用程序之間的通信,傳輸層最著名的協議非TCP與UDP協議末屬了;應用層,顧名思義,當然就是由應用程序提供的,用來對傳輸數據進行語義解釋的“人機界面”層了,比如HTTP,SMTP,FTP等等,其實應用層還不是人們最終所看到的那一層,最上面的一層應該是“解釋層”,負責將數據以各種不同的表項形式最終呈獻到人們眼前。

    Linux網絡核心架構

    Linux的網絡架構從上往下可以分為三層,分別是 :

    用戶空間的應用層。

    內核空間的網絡協議棧層。

    物理硬件層。

    其中最重要最核心的當然是內核空間的協議棧層了。

    Linux網絡協議棧結構

    Linux的整個網絡協議棧都構建與Linux Kernel中,整個棧也是嚴格按照分層的思想來設計的,整個棧共分為五層,分別是 :

    1. 系統調用接口層,實質是一個面向用戶空間應用程序的接口調用庫,向用戶空間應用程序提供使用網絡服務的接口。

    2. 協議無關的接口層,就是SOCKET層,這一層的目的是屏蔽底層的不同協議(更準確的來說主要是TCP與UDP,當然還包括RAW IP, SCTP等),以便與系統調用層之間的接口可以簡單,統一。簡單的說,不管我們應用層使用什么協議,都要通過系統調用接口來建立一個SOCKET,這個SOCKET其實是一個巨大的sock結構,它和下面一層的網絡協議層聯系起來,屏蔽了不同的網絡協議的不同,只吧數據部分呈獻給應用層(通過系統調用接口來呈獻)。

    3. 網絡協議實現層,毫無疑問,這是整個協議棧的核心。這一層主要實現各種網絡協議,最主要的當然是IP,ICMP,ARP,RARP,TCP,UDP等。這一層包含了很多設計的技巧與算法,相當的不錯。

    4. 與具體設備無關的驅動接口層,這一層的目的主要是為了統一不同的接口卡的驅動程序與網絡協議層的接口,它將各種不同的驅動程序的功能統一抽象為幾個特殊的動作,如open,close,init等,這一層可以屏蔽底層不同的驅動程序。

    5. 驅動程序層,這一層的目的就很簡單了,就是建立與硬件的接口層。

    可以看到,Linux網絡協議棧是一個嚴格分層的結構,其中的每一層都執行相對獨立的功能,結構非常清晰。

    其中的兩個“無關”層的設計非常棒,通過這兩個“無關”層,其協議棧可以非常輕松的進行擴展。在我們自己的軟件設計中,可以吸收這種設計方法。



Fucker 2010-12-14 17:21 發表評論
]]>
99热都是精品久久久久久| 国产午夜精品理论片久久影视| 久久艹国产| 久久人妻无码中文字幕| 国产精品久久午夜夜伦鲁鲁| 国产精品久久久久影视不卡| 久久久噜噜噜久久| 久久99精品久久久久久久不卡 | 国产激情久久久久影院老熟女免费| 97久久精品人人做人人爽| 伊人久久大香线蕉综合5g| 久久精品国产亚洲网站| 蜜桃麻豆www久久国产精品| 国产高潮国产高潮久久久| 久久综合久久综合亚洲| 香蕉久久一区二区不卡无毒影院| 亚洲伊人久久成综合人影院| 2020久久精品国产免费| 2021久久精品免费观看| 久久综合伊人77777| 久久精品国产精品亚洲精品| 一本色道久久HEZYO无码| 久久亚洲中文字幕精品一区| 色噜噜狠狠先锋影音久久| 久久亚洲精品无码AV红樱桃| 久久亚洲高清综合| 久久久久国产精品三级网| 久久精品国产福利国产秒| 久久久久亚洲精品无码蜜桃| 伊人久久大香线蕉亚洲| 久久久久久免费视频| 无码8090精品久久一区| 国内精品久久久久久久coent | 久久精品国产69国产精品亚洲| 久久天堂AV综合合色蜜桃网| 狠狠综合久久AV一区二区三区| 日韩久久无码免费毛片软件 | yy6080久久| 亚洲成av人片不卡无码久久 | 久久综合给久久狠狠97色| 亚洲午夜久久久久妓女影院|