• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            Linux新手入門:Unable to locate package錯誤解決辦法

            最近剛開始接觸Linux,在虛擬機中裝了個Ubuntu,當前的版本是Ubuntu 11.10,裝好后自然少不了安裝一些軟件,在設置了軟件的源后,就開始了 sudo apt-get install,結果出現了下面的Unable to locate package錯誤:
            1. letuknowit@ubuntu:~$ sudo apt-get install mysql-server mysql-client
            2. [sudo] password for letuknowit:
            3. Reading package lists… Done
            4. Building dependency tree    
            5. Reading state information… Done
            6. E: Unable to locate package mysql-server
            7. E: Unable to locate package mysql-client
            8. letuknowit@ubuntu:~$

              這叫一個郁悶啊,出師不利,不帶這么嚇唬剛玩Ubuntu的小朋友吧~于是趕緊找資料,又回顧下前面的操作,最后發現問題出在執行sudo apt-get install之前更換了軟件源,但是卻忘了update下了,于是執行下面的命令:

            1. sudo apt-get update

            等上面命令執行完后,再執行sudo apt-get install就可以了!其實錯誤信息已經很明確了,Unable to locate packet就是無法找到包嘛,那還不趕緊sudo apt-get update下!

            posted @ 2012-04-29 07:34 多彩人生 閱讀(152944) | 評論 (5)編輯 收藏

            make

            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”來顯式的表示是“偽目標”。


            ///////////////////////////////////////////////////////////////

            posted @ 2012-04-26 23:53 多彩人生 閱讀(308) | 評論 (0)編輯 收藏

            linux 進程 和 作業

            Linux是一個多用戶多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計 算機系統;多任務是指Linux可以同時執行幾個任務,
            它可以在還未執行完一個任務時又 執行另一項任務。    操作系統管理多個用戶的請求和多個任務。大多數系統都只有一個CPU和一個主存,
            但一個系統可能有多個二級存儲磁盤和多個輸入/輸出設備。操作系統管理這些資源并在 多個用戶間共享資源,當您提出一個請求時,給您造成一種假象,
            好象系統只被您獨自占 用。而實際上操作系統監控著一個等待執行的任務隊列,這些任務包括用戶作業、操作系 統任務、郵件和打印作業等。
            操作系統根據每個任務的優先級為每個任務分配合適的時間 片,每個時間片大約都有零點幾秒,雖然看起來很短,但實際上已經足夠計算機完成成千
            上萬的指令集。每個任務都會被系統運行一段時間,然后掛起,系統轉而處理其他任務; 過一段時間以后再回來處理這個任務,直到某個任務完成,
            從任務隊列中去除。    Linux系統上所有運行的東西都可以稱之為一個進程。每個用戶任務、每個系統管理 守護進程,都可以稱之為進程
            Linux用分時管理方法使所有的任務共同分享系統資源。 我們討論進程的時候,不會去關心這些進程究竟是如何分配的,或者是內核如何管理分配
            時間片的,我們所關心的是如何去控制這些進程,讓它們能夠很好地為用戶服務。    進程的一個比較正式的定義是:在自身的虛擬地址空間運行的一個
            單獨的程序。進 程程序是有區別的,進程不是程序,雖然它由程序產生。程序只是一個靜態的指令集合 ,不占系統的運行資源;而進程是一個隨時都
            可能發生變化的、動態的、使用系統運行資 源的程序。而且一個程序可以啟動多個進程。   Linux操作系統包括三種不同類型的進程,每種進程都有自己
            的特點和屬性。   交互進程——由一個shell啟動的進程。交互進程既可以在前臺運行,也可以在后臺運行 批處理進程——這種進程和終端沒有聯系,
            是一個進程序列   監控進程(也稱守護進程)——Linux系統啟動時啟動的進程,并在后臺運行。    上述三種進程各有各的作用,使用場合也有所
            不同。    進程作業的概念也有區別。一個正在執行的進程稱為一個作業,而且作業可以包 含一個或多個進程,尤其是當使用了管道和重定向命令。
            例如“nroff -man ps.1|grep kill|more”這個作業就同時啟動了三個進程。    作業控制指的是控制正在運行的進程的行為。比如,用戶可以掛起一個
            進程,等一 會兒再繼續執行該進程。shell將記錄所有啟動的進程情況,在每個進程過程中,用戶可 以任意地掛起進程或重新啟動進程作業控制是許
            多shell(包括bash和tcsh)的一個特 性,使用戶能在多個獨立作業間進行切換。    一般而言,進程作業控制相關聯時,才被稱為作業。   
            在大多數情況下,用戶在同一時間只運行一個作業,即它們最后向shell鍵入的命令 。但是使用作業控制,用戶可以同時運行多個作業,并在需要時在
            這些作業間進行切換。 這會有什么用途呢?例如,當用戶編輯一個文本文件,并需要中止編輯做其他事情時,利 用作業控制,用戶可以讓編輯器暫
            時掛起,返回shell提示符開始做其他的事情。其他事 情做完以后,用戶可以重新啟動掛起的編輯器,返回到剛才中止的地方,就象用戶從來沒 有離開
            編輯器一樣。這只是一個例子,作業控制還有許多其他實際的用途。

            posted @ 2012-04-25 17:34 多彩人生 閱讀(507) | 評論 (0)編輯 收藏

            SetConsoleCtrlHandler

                   有時候運行在服務器上的控制臺程序,需要記錄詳細的運行日志,這就需要對程序關閉進行日志記錄,以便能根據日志了解程序的運行狀況。比如正在運行的程序被 人不小心關閉了,導致最終任務沒有運行成功,這時日志也沒有錯誤記錄,對分析原因造成不便,記錄了關閉事件日志后就能了解到這種情況是程序被終止了。這樣 注意通過消息鉤子來實現,通過調用WIN32 API SetConsoleCtrlHandler方法來實現,具體代碼如下:


            using System;
            using System.Windows.Forms;
            using System.Diagnostics;
            using System.Runtime.InteropServices;


            namespace ConsoleColsed
            {
                public delegate bool ConsoleCtrlDelegate(int ctrlType);
                class Program
                {
                    [DllImport("kernel32.dll")]
                    private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
                    //當用戶關閉Console時,系統會發送次消息
                    private const int CTRL_CLOSE_EVENT = 2;
                    //Ctrl+C,系統會發送次消息
                    private const int CTRL_C_EVENT = 0;
                    //Ctrl+break,系統會發送次消息
                    private const int CTRL_BREAK_EVENT = 1;
                    //用戶退出(注銷),系統會發送次消息
                    private const int CTRL_LOGOFF_EVENT = 5;
                    //系統關閉,系統會發送次消息
                    private const int CTRL_SHUTDOWN_EVENT = 6;

                    static void Main(string[] args)
                    {
                        Program cls = new Program();
                        //Console.ReadKey();
                    }
                    public Program()
                    {
                        ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);

                        bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
                        if (bRet == false) //安裝事件處理失敗
                        {
                            Debug.WriteLine("error");
                        }
                        else
                        {
                            Console.WriteLine("ok");
                            Console.Read();
                        }

                    }

                    private static bool HandlerRoutine(int ctrlType)
                    {
                        switch(ctrlType)
                        {
                            case CTRL_C_EVENT:
                                MessageBox.Show("C");
                                break;
                            case CTRL_BREAK_EVENT:
                                MessageBox.Show("BREAK");
                                break;
                            case CTRL_CLOSE_EVENT:
                                MessageBox.Show("CLOSE");
                                break;
                            case CTRL_LOGOFF_EVENT:
                                break;
                            case CTRL_SHUTDOWN_EVENT:
                                break;
                        }
                        //return true;//表示阻止響應系統對該程序的操作
                        return false;//忽略處理,讓系統進行默認操作
                    }
                }
            }

            CTRL_CLOSE_EVENT 這些都是在C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinCon.h中定義的,c或者c++調用包含這個頭文件就可以。

            return true的時候關閉的時候會產生應用程序無法關閉的錯誤,不知道什么原因。return false則不會。根據msdn上的方法說明 If the function handles the control signal, it should return TRUE. If it returns FALSE, the next handler function in the list of handlers for this process is used. 按照這個解釋,返回true也不應該出現應用程序無法關閉的錯誤,不知道是什么原因。

            posted @ 2012-04-24 22:44 多彩人生 閱讀(1220) | 評論 (0)編輯 收藏

            程序

            程序大體是這樣的:
            一個入口, 然后初始化一些數據,然后進入一個循環不停地處理事件。這個事件可能是操作界面所觸發,可能是網絡數據所觸發

            posted @ 2012-04-24 14:13 多彩人生 閱讀(156) | 評論 (0)編輯 收藏

            memmove 和 memcopy

            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;
            }

            posted @ 2012-04-23 18:28 多彩人生 閱讀(5894) | 評論 (1)編輯 收藏

            asio

            http://www.rosoo.net/a/201002/8563.html

            posted @ 2012-04-22 23:21 多彩人生 閱讀(184) | 評論 (0)編輯 收藏

            模板

            // 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;
            }

            posted @ 2012-04-20 17:00 多彩人生 閱讀(210) | 評論 (0)編輯 收藏

            Linux中如何讓進程在后臺運行

            http://www.ningoo.net/html/2008/how_to_run_processes_on_background_in_linux.html

            posted @ 2012-04-19 00:23 多彩人生 閱讀(349) | 評論 (0)編輯 收藏

            linux 學習之路

            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 命令建立剖析信息.

            posted @ 2012-04-18 19:43 多彩人生 閱讀(310) | 評論 (0)編輯 收藏

            僅列出標題
            共25頁: First 16 17 18 19 20 21 22 23 24 Last 

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日韩va亚洲va欧美va久久| 国产精品久久久久9999高清| 日本国产精品久久| 久久精品无码一区二区WWW| 午夜精品久久久久久久久| 99久久中文字幕| 热久久视久久精品18| 久久91亚洲人成电影网站| 女同久久| 99久久国产免费福利| 97久久国产综合精品女不卡| 日本精品久久久久中文字幕8| 久久久高清免费视频| 久久久国产精品| 久久青青草原国产精品免费| 青青草原综合久久大伊人| 国产精品免费久久久久影院| 亚洲精品乱码久久久久久| 亚洲国产婷婷香蕉久久久久久| 青青热久久综合网伊人| 精品国产一区二区三区久久久狼 | 老司机午夜网站国内精品久久久久久久久 | 精品久久一区二区三区| 囯产极品美女高潮无套久久久| 精品国产乱码久久久久久浪潮| 97久久精品无码一区二区天美 | 久久影院久久香蕉国产线看观看| 久久久久国产一级毛片高清版| 欧美一区二区三区久久综| 一本色综合网久久| 亚洲国产精品高清久久久| 免费无码国产欧美久久18| 亚洲欧美日韩久久精品| 久久亚洲视频| 久久久久18| 久久久无码精品午夜| 人人狠狠综合久久亚洲高清| 武侠古典久久婷婷狼人伊人| 亚洲国产日韩综合久久精品| 区久久AAA片69亚洲| 一本色道久久88精品综合 |