最近剛開始接觸
Linux,在虛擬機中裝了個
Ubuntu,當前的版本是
Ubuntu 11.10,裝好后自然少不了安裝一些軟件,在設置了軟件的源后,就開始了 sudo apt-get install,結果出現了下面的Unable to locate package錯誤:
- letuknowit@ubuntu:~$ sudo apt-get install mysql-server mysql-client
- [sudo] password for letuknowit:
- Reading package lists… Done
- Building dependency tree
- Reading state information… Done
- E: Unable to locate package mysql-server
- E: Unable to locate package mysql-client
- letuknowit@ubuntu:~$
這叫一個郁悶啊,出師不利,不帶這么嚇唬剛玩Ubuntu的小朋友吧~于是趕緊找資料,又回顧下前面的操作,最后發現問題出在執行sudo apt-get install之前更換了軟件源,但是卻忘了update下了,于是執行下面的命令:
等上面命令執行完后,再執行sudo apt-get install就可以了!其實錯誤信息已經很明確了,Unable to locate packet就是無法找到包嘛,那還不趕緊sudo apt-get update下!
make是一個命令工具,是一個解釋makefile中指令的命令工具。
一般來說每一個源文件都會對應一個中間目標文件。
編譯(compile)生成中間目標文件,連接(link)生成可執行文件,連接主要是連接函數和變量。鏈接器不管源文件,只管中間目標文件。函數如果未被聲明可以生成中間目標文件,但是連接時候會報錯。
make命令執行時候需要一個makefile文件,以告訴make命令需要怎么樣去編譯和連接程序。我們需要一個makefile來告訴make命令如何編譯個連接。規則是:
1)如果這個工程沒有被編譯過,那么我們所有的c文件都要被編譯并且被連接
2)如果這個工程中間的幾個c文件被修改,那么我們只需要編譯被修改的c文件,并且連接目標程序
3)如果這個工程的頭文件被修改,那么需要編譯引用這個頭文件的c文件。并且連接目標文件。
makefile的規則:
targe...: prerequisites...
command
...
...
;target就是一個目標文件,可以是一個obj文件,也可以是可執行文件,還可以是一個標簽(label)。
;prerequisites就是要生成那個target所需要的文件或者是目標。
;command也就是make要執行的命令。(任意的shell命令)
依賴關系實質上說明了目標文件是由哪些文件生成的,換言之,目標文件是由哪些文件更新的。在定義好依賴關系以后,后續的那一行定義了如何生成目標文件的操作系統命令,一定要一個tab鍵開頭。
在默認的方式下,我們只是輸入了make命令,那么make是如何工作的呢?
1)make會在當前目錄下尋找名字叫“Makefile”或者“makefile”的文件
2)如果找到,它就會找文件中的第一個目標文件(target)。就是makefile文件中的第一個target。并且把這個文件作為最終的目標文件。
3)如果目標文件不存在,或者是目標所依賴后面的.o文件的修改時間要比target文件新,那么就會執行后面所定義的命令來生成目標文件
4)如果目標文件所依賴的.o文件也不存在,那么make就會在當前文件中間尋找.o文件的依賴型。生成.0文件
5)當然,c文件和h文件都是存在的啦。于是make會生成.o文件,然后再用.o文件生成make的終極任務,也就是最終的目標文件。
make的依賴型:make會一層一層的尋找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中如果出現錯誤,比如最后被依賴的文件沒 有找到,那么make會直接推出,并且報錯。對于所定義的命令的錯誤,或者是編譯不成功,make根本不理睬。make只管文件的依賴型。
聲明一個變量,叫objects,OBJECTS,objs,OBJS,obj,OBJ.在makefile中以“$(objects)”的方式來使用這個變量。
每一個makefile中都應該寫一個清空目標文件(.o和執行文件)的規則。這不僅便于重新編譯,而且有利于保持文件的清潔。clean從來就是放在文件的最后。
makefile里面有什么?主要包括五個東西:顯式規則,隱晦規則,變量定義,文件指示和注釋。
1)顯式規則:要生成的文件,文件的依賴文件和生成的命令。
2)隱晦規則:make有自動推導的功能,能夠推導出依賴關系。
3)變量的定義:makefile中要定義一系列的變量,變量一般都是字符串。
4)文件指示:包括三部分:
A)一個makefile引用另一個makefile,類似于c中的“include”。使用include關鍵字將別的makefile包含進來。語法:include<filename>
B)根據某些情況指定makefile中的有效部分,類似于c中的“#if”
C)多行命令
5)注釋:行注釋“#”,用“\#”進行轉義。
make一次尋找“GNUmakefile”,“makefile”,“Makefile”。
偽目標并不是一個文件,只是一個標簽,由于“偽目標”不是文件,所以make無法生成他的依賴關系和決定它是否要執行。為了避免偽目標和文件重名,使用特殊的標記“.PHONY”來顯式的表示是“偽目標”。
///////////////////////////////////////////////////////////////
Linux是一個多用戶多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計 算機系統;多任務是指Linux可以同時執行幾個任務,
它可以在還未執行完一個任務時又 執行另一項任務。 操作系統管理多個用戶的請求和多個任務。大多數系統都只有一個CPU和一個主存,
但一個系統可能有多個二級存儲磁盤和多個輸入/輸出設備。操作系統管理這些資源并在 多個用戶間共享資源,當您提出一個請求時,給您造成一種假象,
好象系統只被您獨自占 用。而實際上操作系統監控著一個等待執行的任務隊列,這些任務包括用戶作業、操作系 統任務、郵件和打印作業等。
操作系統根據每個任務的優先級為每個任務分配合適的時間 片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經足夠計算機完成成千
上萬的指令集。每個任務都會被系統運行一段時間,然后掛起,系統轉而處理其他任務; 過一段時間以后再回來處理這個任務,直到某個任務完成,
從任務隊列中去除。 Linux系統上所有運行的東西都可以稱之為一個進程。每個用戶任務、每個系統管理 守護進程,都可以稱之為進程。
Linux用分時管理方法使所有的任務共同分享系統資源。 我們討論進程的時候,不會去關心這些進程究竟是如何分配的,或者是內核如何管理分配
時間片的,我們所關心的是如何去控制這些進程,讓它們能夠很好地為用戶服務。 進程的一個比較正式的定義是:在自身的虛擬地址空間運行的一個
單獨的程序。進 程與程序是有區別的,進程不是程序,雖然它由程序產生。程序只是一個靜態的指令集合 ,不占系統的運行資源;而進程是一個隨時都
可能發生變化的、動態的、使用系統運行資 源的程序。而且一個程序可以啟動多個進程。 Linux操作系統包括三種不同類型的進程,每種進程都有自己
的特點和屬性。 交互進程——由一個shell啟動的進程。交互進程既可以在前臺運行,也可以在后臺運行 批處理進程——這種進程和終端沒有聯系,
是一個進程序列 監控進程(也稱守護進程)——Linux系統啟動時啟動的進程,并在后臺運行。 上述三種進程各有各的作用,使用場合也有所
不同。 進程和作業的概念也有區別。一個正在執行的進程稱為一個作業,而且作業可以包 含一個或多個進程,尤其是當使用了管道和重定向命令。
例如“nroff -man ps.1|grep kill|more”這個作業就同時啟動了三個進程。 作業控制指的是控制正在運行的進程的行為。比如,用戶可以掛起一個
進程,等一 會兒再繼續執行該進程。shell將記錄所有啟動的進程情況,在每個進程過程中,用戶可 以任意地掛起進程或重新啟動進程。作業控制是許
多shell(包括bash和tcsh)的一個特 性,使用戶能在多個獨立作業間進行切換。 一般而言,進程與作業控制相關聯時,才被稱為作業。
在大多數情況下,用戶在同一時間只運行一個作業,即它們最后向shell鍵入的命令 。但是使用作業控制,用戶可以同時運行多個作業,并在需要時在
這些作業間進行切換。 這會有什么用途呢?例如,當用戶編輯一個文本文件,并需要中止編輯做其他事情時,利 用作業控制,用戶可以讓編輯器暫
時掛起,返回shell提示符開始做其他的事情。其他事 情做完以后,用戶可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象用戶從來沒 有離開
編輯器一樣。這只是一個例子,作業控制還有許多其他實際的用途。
程序大體是這樣的:
一個入口, 然后初始化一些數據,然后進入一個循環不停地處理事件。這個事件可能是操作界面所觸發,可能是網絡數據所觸發
1.memmove
函數原型:void *memmove(void *dest, const void *source, size_t count)
返回值說明:返回指向dest的void *指針
參數說明:dest,source分別為目標串和源串的首地址。count為要移動的字符的個數
函數說明:memmove用于從source拷貝count個字符到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區域中。
2.memcpy
函數原型:void *memcpy(void *dest, const void *source, size_t count);
返回值說明:返回指向dest的void *指針
函數說明:memcpy功能和memmove相同,但是memcpy中dest和source中的區域不能重疊,否則會出現未知結果。
3.兩者區別
函數memcpy() 從source 指向的區域向dest指向的區域復制count個字符,如果兩數組重疊,不定義該函數的行為。
而memmove(),如果兩函數重疊,賦值仍正確進行。
memcpy函數假設要復制的內存區域不存在重疊,如果你能確保你進行復制操作的的內存區域沒有任何重疊,可以直接用memcpy;
如果你不能保證是否有重疊,為了確保復制的正確性,你必須用memmove。
memcpy的效率會比memmove高一些,如果還不明白的話可以看一些兩者的實現:
void *memmove(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_source, *tmp_dest;
tmp_source = (char *)source;
tmp_dest = (char *)dest;
if((dest + count<source) || (source + count) <dest))
{// 如果沒有重疊區域
while(count--)
*tmp_dest++ = *tmp_source++;
}
else
{ //如果有重疊
tmp_source += count - 1;
tmp_dest += count - 1;
while(count--)
*--tmp_dest = *--tmp;
}
return dest;
}
void *memcpy(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_dest = (char *)dest;
char *tmp_source = (char *)source;
while(count --)//不對是否存在重疊區域進行判斷
*tmp_dest ++ = *tmp_source ++;
return dest;
}
http://www.rosoo.net/a/201002/8563.html
// my_class.h
template<typename T>
class my_class
{
void foo();
}
// my_class.cpp
template<typename T>
void my_class<T>::foo()
{
}
// 如果成員函數的實現不是放在h文件里,那么引用模板的地方也要包含cpp文件
// main.cpp
#include "my_class.h"
#include "my_class.cpp"
int main(int argv, char* argc[])
{
my_class<int> c;
}
http://www.ningoo.net/html/2008/how_to_run_processes_on_background_in_linux.html
1/
按ctrl+alt+f1...7切換, 1-6為命令窗口,7為xwindow, 參考"鳥哥私房菜"p115
注意ctrl+alt與vwmare的按建沖突
2/
在tty1下登陸 login incorrect錯誤, 這是一個bug, 需要把小鍵盤的 numlock 關掉再輸出密碼
3/
there are stopped jobs 見我的同名博文
4/
GCC 有超過100個的編譯選項可用. 這些選項中的許多你可能永遠都不會用到, 但一些主要的選項將會頻繁用到. 很多的 GCC 選項包括一個以上的字符. 因此你必須為每個選項指定各自的連字符, 并且就象大多數 Linux 命令一樣你不能在一個單獨的連字符后跟一組選項. 例如, 下面的兩個命令是不同的:
gcc -p -g test.c
gcc -pg test.c
第一條命令告訴 GCC 編譯 test.c 時為 prof 命令建立剖析(profile)信息并且把調試信息加入到可執行的文件里. 第二條命令只告訴 GCC 為 gprof 命令建立剖析信息.