成長(zhǎng)空間

          MiLife

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          Automation Testing Development

          最新評(píng)論

          2009年1月4日 #

          gdb

          基礎(chǔ):
          http://blog.csai.cn/user3/50125/archives/2009/35140.html

          多進(jìn)程:
          http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

          多線程:
          http://www.91linux.com/html/article/program/20070406/1441.html

          break [linespec] thread [threadno]
           http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=692404&page=0&view=collapsed&sb=5&o=all

          posted @ 2009-05-25 13:45 Picasso 閱讀(348) | 評(píng)論 (0)編輯 收藏

          sonmame - used to provide version backwards-compatibility information.

              In Unix operating systems, a soname is a field of data in a shared object file. The soname is a string (typically the filename of the library) which is used as a "logical name" describing the functionality of the object. This is often used to provide version backwards-compatibility information. For instance, if versions 1.0 through 1.9 of the shared library libx provide identical interface, they would all have the same soname, e.g. libx.so.1. If the system only includes version 1.3 of that shared object, libx.so.1.3, the soname field of the shared object tells the system that it can be used to fill the dependency for a binary which was originally compiled using version 1.2.

          posted @ 2009-05-05 15:13 Picasso 閱讀(369) | 評(píng)論 (0)編輯 收藏

          轉(zhuǎn)載:Linux內(nèi)存管理(上)

               摘要: http://blog.csdn.net/kanghua/archive/2007/10/22/1837876.aspx http://blog.csdn.net/kanghua/archive/2007/10/22/1837872.aspx 摘要:本章首先以應(yīng)用程序開(kāi)發(fā)者的角度審視Linux的進(jìn)程內(nèi)存管理,在此基礎(chǔ)上逐步深入到內(nèi)核中討論系統(tǒng)物理內(nèi)存管理和內(nèi)核內(nèi)存地使用方法。力求從外自內(nèi)、...  閱讀全文

          posted @ 2009-03-17 17:21 Picasso 閱讀(1032) | 評(píng)論 (0)編輯 收藏

          Linux 關(guān)于動(dòng)態(tài)鏈接庫(kù)以及靜態(tài)鏈接庫(kù)的一些概念

          From http://os.rdxx.com/Linux/LinuxRudiment/2008/5/17017197011.shtml

          庫(kù)有動(dòng)態(tài)與靜態(tài)兩種,動(dòng)態(tài)通常用.so為后綴,靜態(tài)用.a為后綴。例如:libhello.so libhello.a
          為了在同一系統(tǒng)中使用不同版本的庫(kù),可以在庫(kù)文件名后加上版本號(hào)為后綴,例如: libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名。所以為了使用這些庫(kù),通常使用建立符號(hào)連接的方式。
          ln -s libhello.so.1.0 libhello.so.1
          ln -s libhello.so.1 libhello.so
          使用庫(kù)
          當(dāng) 要使用靜態(tài)的程序庫(kù)時(shí),連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態(tài)程序庫(kù)也就不再需要了。然 而,對(duì)動(dòng)態(tài)庫(kù)而言,就不是這樣。動(dòng)態(tài)庫(kù)會(huì)在執(zhí)行程序內(nèi)留下一個(gè)標(biāo)記‘指明當(dāng)程序執(zhí)行時(shí),首先必須載入這個(gè)庫(kù)。由于動(dòng)態(tài)庫(kù)節(jié)省空間,linux下進(jìn)行連接的 缺省操作是首先連接動(dòng)態(tài)庫(kù),也就是說(shuō),如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫(kù),不特別指定的話,將與動(dòng)態(tài)庫(kù)相連接。
          現(xiàn)在假設(shè)有一個(gè)叫hello的程序開(kāi)發(fā)包,它提供一個(gè)靜態(tài)庫(kù)libhello.a 一個(gè)動(dòng)態(tài)庫(kù)libhello.so,一個(gè)頭文件hello.h,頭文件中提供sayhello()這個(gè)函數(shù)
          /* hello.h */
          void sayhello();
          另外還有一些說(shuō)明文檔。這一個(gè)典型的程序開(kāi)發(fā)包結(jié)構(gòu)
          1.與動(dòng)態(tài)庫(kù)連接
          linux默認(rèn)的就是與動(dòng)態(tài)庫(kù)連接,下面這段程序testlib.c使用hello庫(kù)中的sayhello()函數(shù)
          /*testlib.c*/
          #include  
          #include  
          int main()
          {
          sayhello();
          return 0;
          }
          使用如下命令進(jìn)行編譯
          $gcc -c testlib.c -o testlib.o
          用如下命令連接:
          $gcc testlib.o -lhello -o testlib
          在連接時(shí)要注意,假設(shè)libhello.o 和libhello.a都在缺省的庫(kù)搜索路徑下/usr/lib下,如果在其它位置要加上-L參數(shù)
          與與靜態(tài)庫(kù)連接麻煩一些,主要是參數(shù)問(wèn)題。還是上面的例子:
          $gcc testlib.o -o testlib -WI,-Bstatic -lhello
          注:這個(gè)特別的"-WI,-Bstatic"參數(shù),實(shí)際上是傳給了連接器ld.
          指示它與靜態(tài)庫(kù)連接,如果系統(tǒng)中只有靜態(tài)庫(kù)當(dāng)然就不需要這個(gè)參數(shù)了。
          如果要和多個(gè)庫(kù)相連接,而每個(gè)庫(kù)的連接方式不一樣,比如上面的程序既要和libhello進(jìn)行靜態(tài)連接,又要和libbye進(jìn)行動(dòng)態(tài)連接,其命令應(yīng)為:
          $gcc testlib.o -o testlib -WI,-Bstatic -lhello -WI,-Bdynamic -lbye
          3.動(dòng)態(tài)庫(kù)的路徑問(wèn)題
          為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫(kù),有三種方法:
          (1)把庫(kù)拷貝到/usr/lib和/lib目錄下。
          (2)在LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑。例如動(dòng)態(tài)庫(kù)libhello.so在/home/ting/lib目錄下,以bash為例,使用命令:
          $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
          (3) 修改/etc/ld.so.conf文件,把庫(kù)所在的路徑加到文件末尾,并執(zhí)行l(wèi)dconfig刷新。這樣,加入的目錄下的所有庫(kù)文件都可見(jiàn)、
          4.查看庫(kù)中的符號(hào)
          有 時(shí)候可能需要查看一個(gè)庫(kù)中到底有哪些函數(shù),nm命令可以打印出庫(kù)中的涉及到的所有符號(hào)。庫(kù)既可以是靜態(tài)的也可以是動(dòng)態(tài)的。nm列出的符號(hào)有很多,常見(jiàn)的有 三種,一種是在庫(kù)中被調(diào)用,但并沒(méi)有在庫(kù)中定義(表明需要其他庫(kù)支持),用U表示;一種是庫(kù)中定義的函數(shù),用T表示,這是最常見(jiàn)的;另外一種是所謂的“弱 態(tài)”符號(hào),它們雖然在庫(kù)中被定義,但是可能被其他庫(kù)中的同名符號(hào)覆蓋,用W表示。例如,假設(shè)開(kāi)發(fā)者希望知道上央提到的hello庫(kù)中是否定義了 printf():
          $nm libhello.so |grep printf
          U printf
          U表示符號(hào)printf被引用,但是并沒(méi)有在函數(shù)內(nèi)定義,由此可以推斷,要正常使用hello庫(kù),必須有其它庫(kù)支持,再使用ldd命令查看hello依賴于哪些庫(kù):
          $ldd hello
          libc.so.6=>/lib/libc.so.6(0x400la000)
          /lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)
          從上面的結(jié)果可以繼續(xù)查看printf最終在哪里被定義,有興趣可以go on
          生成庫(kù)
          第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼為例,生成上面用到的hello庫(kù):

          /* hello.c */
          #include  
          void sayhello()
          {
          printf("hello,world\n");
          }
          用gcc編繹該文件,在編繹時(shí)可以使用任何全法的編繹參數(shù),例如-g加入調(diào)試代碼等:
          gcc -c hello.c -o hello.o
          1.連接成靜態(tài)庫(kù)
          連接成靜態(tài)庫(kù)使用ar命令,其實(shí)ar是archive的意思
          $ar cqs libhello.a hello.o
          2.連接成動(dòng)態(tài)庫(kù)
          生成動(dòng)態(tài)庫(kù)用gcc來(lái)完成,由于可能存在多個(gè)版本,因此通常指定版本號(hào):
          $gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
          另外再建立兩個(gè)符號(hào)連接:
          $ln -s libhello.so.1.0 libhello.so.1
          $ln -s libhello.so.1 libhello.so
          這樣一個(gè)libhello的動(dòng)態(tài)連接庫(kù)就生成了。最重要的是傳gcc -shared 參數(shù)使其生成是動(dòng)態(tài)庫(kù)而不是普通執(zhí)行程序。
          -Wl 表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理。實(shí)際上,每一個(gè)庫(kù)都有一個(gè)soname,當(dāng)連接器發(fā)現(xiàn)它正 在查找的程序庫(kù)中有這樣一個(gè)名稱,連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,在程序執(zhí)行期間,程序會(huì)查找擁有 soname名字的文件,而不是庫(kù)的文件名,換句話說(shuō),soname是庫(kù)的區(qū)分標(biāo)志。
          這樣做的目的主要是允許系統(tǒng)中多個(gè)版本的庫(kù)文件共存,習(xí)慣上在命名庫(kù)文件的時(shí)候通常與soname相同
          libxxxx.so.major.minor
          其中,xxxx是庫(kù)的名字,major是主版本號(hào),minor 是次版本號(hào)



          =====================

          摘要:動(dòng)態(tài)鏈接庫(kù)技術(shù)實(shí)現(xiàn)和設(shè)計(jì)程序常用的技術(shù),在Windows和Linux系統(tǒng)中都有動(dòng)態(tài)庫(kù)的概念,采用動(dòng)態(tài)庫(kù)可以有效的減少程序大小,節(jié)省空間,提高效率,增加程序的可擴(kuò)展性,便于模塊化管理。但不同操作系統(tǒng)的動(dòng)態(tài)庫(kù)由于格式 不同,在需要不同操作系統(tǒng)調(diào)用時(shí)需要進(jìn)行動(dòng)態(tài)庫(kù)程序移植。本文分析和比較了兩種操作系統(tǒng)動(dòng)態(tài)庫(kù)技術(shù),并給出了將Visual C++編制的動(dòng)態(tài)庫(kù)移植到Linux上的方法和經(jīng)驗(yàn)。
            
            1、引言
            
            動(dòng)態(tài)庫(kù)(Dynamic Link Library abbr,DLL)技術(shù)是程序設(shè)計(jì)中經(jīng)常采用的技術(shù)。其目的減少程序的大小,節(jié)省空間,提高效率,具有很高的靈活性。采用動(dòng)態(tài)庫(kù)技術(shù)對(duì)于升級(jí)軟件版本更加容易。與靜態(tài)庫(kù)(Static Link Library)不同,動(dòng)態(tài)庫(kù)里面的函數(shù)不是執(zhí)行程序本身的一部分,而是根據(jù)執(zhí)行需要按需載入,其執(zhí)行代碼可以同時(shí)在多個(gè)程序中共享。
            
            在Windows和Linux操作系統(tǒng)中,都可采用這種方式進(jìn)行軟件設(shè)計(jì),但他們的調(diào)用方式以及程序編制方式不盡相同。本文首先分析了在這兩種操作系統(tǒng)中通常采用的動(dòng)態(tài)庫(kù)調(diào)用方法以及程序編制方式,然后分析比較了這兩種方式的不同之處,最后根據(jù)實(shí)際移植程序經(jīng)驗(yàn),介紹了將VC++編制的Windows動(dòng)態(tài)庫(kù)移植到Linux下的方法。
            
            2、動(dòng)態(tài)庫(kù)技術(shù)
            
            2.1 Windows動(dòng)態(tài)庫(kù)技術(shù)
            
            動(dòng)態(tài)鏈接庫(kù)是實(shí)現(xiàn)Windows應(yīng)用程序共享資源、節(jié)省內(nèi)存空間、提高使用效率的一個(gè)重要技術(shù)手段。常見(jiàn)的動(dòng)態(tài)庫(kù)包含外部函數(shù)和資源,也有一些動(dòng)態(tài)庫(kù)只包含資源,如Windows字體資源文件,稱之為資源動(dòng)態(tài)鏈接庫(kù)。通常動(dòng)態(tài)庫(kù)以.dll,.drv、.fon等作為后綴。相應(yīng)的windows靜態(tài)庫(kù)通常以.lib結(jié)尾,Windows自己就將一些主要的系統(tǒng)功能以動(dòng)態(tài)庫(kù)模塊的形式實(shí)現(xiàn)。
            
            Windows動(dòng)態(tài)庫(kù)在運(yùn)行時(shí)被系統(tǒng)加載到進(jìn)程的虛擬空間中,使用從調(diào)用進(jìn)程的虛擬地址空間分配的內(nèi)存,成為調(diào)用進(jìn)程的一部分。DLL也只能被該進(jìn)程的線程所訪問(wèn)。DLL的句柄可以被調(diào)用進(jìn)程使用;調(diào)用進(jìn)程的句柄可以被DLL使用。DLL模塊中包含各種導(dǎo)出函數(shù),用于向外界提供服務(wù)。DLL可以有自己的數(shù)據(jù)段,但沒(méi)有自己的堆棧,使用與調(diào)用它的應(yīng)用程序相同的堆棧模式;一個(gè)DLL在內(nèi)存中只有一個(gè)實(shí)例;DLL實(shí)現(xiàn)了代碼封裝性;DLL的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān),可以通過(guò)DLL來(lái)實(shí)現(xiàn)混合語(yǔ)言編程。DLL函數(shù)中的代碼所創(chuàng)建的任何對(duì)象(包括變量)都?xì)w調(diào)用它的線程或進(jìn)程所有。
            
            根據(jù)調(diào)用方式的不同,對(duì)動(dòng)態(tài)庫(kù)的調(diào)用可分為靜態(tài)調(diào)用方式和動(dòng)態(tài)調(diào)用方式。
            
            (1)靜態(tài)調(diào)用,也稱為隱式調(diào)用,由編譯系統(tǒng)完成對(duì)DLL的加載和應(yīng)用程序結(jié)束時(shí)DLL卸載的編碼(Windows系統(tǒng)負(fù)責(zé)對(duì)DLL調(diào)用次數(shù)的計(jì)數(shù)),調(diào)用方式簡(jiǎn)單,能夠滿足通常的要求。通常采用的調(diào)用方式是把產(chǎn)生動(dòng)態(tài)連接庫(kù)時(shí)產(chǎn)生的.LIB文件加入到應(yīng)用程序的工程中,想使用DLL中的函數(shù)時(shí),只須在源文件中聲明一下。 LIB文件包含了每一個(gè)DLL導(dǎo)出函數(shù)的符號(hào)名和可選擇的標(biāo)識(shí)號(hào)以及DLL文件名,不含有實(shí)際的代碼。Lib文件包含的信息進(jìn)入到生成的應(yīng)用程序中,被調(diào)用的DLL文件會(huì)在應(yīng)用程序加載時(shí)同時(shí)加載在到內(nèi)存中。
            
            (2)動(dòng)態(tài)調(diào)用,即顯式調(diào)用方式,是由編程者用API函數(shù)加載和卸載DLL來(lái)達(dá)到調(diào)用DLL的目的,比較復(fù)雜,但能更加有效地使用內(nèi)存,是編制大型應(yīng)用程序時(shí)的重要方式。在Windows系統(tǒng)中,與動(dòng)態(tài)庫(kù)調(diào)用有關(guān)的函數(shù)包括:
            
           ?、貺oadLibrary(或MFC 的AfxLoadLibrary),裝載動(dòng)態(tài)庫(kù)。
            ②GetProcAddress,獲取要引入的函數(shù),將符號(hào)名或標(biāo)識(shí)號(hào)轉(zhuǎn)換為DLL內(nèi)部地址。
           ?、跢reeLibrary(或MFC的AfxFreeLibrary),釋放動(dòng)態(tài)鏈接庫(kù)。
            
            在windows中創(chuàng)建動(dòng)態(tài)庫(kù)也非常方便和簡(jiǎn)單。在Visual C++中,可以創(chuàng)建不用MFC而直接用C語(yǔ)言寫(xiě)的DLL程序,也可以創(chuàng)建基于MFC類(lèi)庫(kù)的DLL程序。每一個(gè)DLL必須有一個(gè)入口點(diǎn),在VC++中,DllMain是一個(gè)缺省的入口函數(shù)。DllMain負(fù)責(zé)初始化(Initialization)和結(jié)束(Termination)工作。動(dòng)態(tài)庫(kù)輸出函數(shù)也有兩種約定,分別是基于調(diào)用約定和名字修飾約定。DLL程序定義的函數(shù)分為內(nèi)部函數(shù)和導(dǎo)出函數(shù),動(dòng)態(tài)庫(kù)導(dǎo)出的函數(shù)供其它程序模塊調(diào)用。通??梢杂邢旅鎺追N方法導(dǎo)出函數(shù):
            
           ?、俨捎媚K定義文件的EXPORT部分指定要輸入的函數(shù)或者變量。
           ?、谑褂肕FC提供的修飾符號(hào)_declspec(dllexport)。
            ③以命令行方式,采用/EXPORT命令行輸出有關(guān)函數(shù)。
            
            在windows動(dòng)態(tài)庫(kù)中,有時(shí)需要編寫(xiě)模塊定義文件(.DEF),它是用于描述DLL屬性的模塊語(yǔ)句組成的文本文件。
            
            2.2 Linux共享對(duì)象技術(shù)
            
            在Linux操作系統(tǒng)中,采用了很多共享對(duì)象技術(shù)(Shared Object),雖然它和Windows里的動(dòng)態(tài)庫(kù)相對(duì)應(yīng),但它并不稱為動(dòng)態(tài)庫(kù)。相應(yīng)的共享對(duì)象文件以.so作為后綴,為了方便,在本文中,對(duì)該概念不進(jìn)行專門(mén)區(qū)分。Linux系統(tǒng)的/lib以及標(biāo)準(zhǔn)圖形界面的/usr/X11R6/lib等目錄里面,就有許多以so結(jié)尾的共享對(duì)象。同樣,在Linux下,也有靜態(tài)函數(shù)庫(kù)這種調(diào)用方式,相應(yīng)的后綴以.a結(jié)束。Linux采用該共享對(duì)象技術(shù)以方便程序間共享,節(jié)省程序占有空間,增加程序的可擴(kuò)展性和靈活性。Linux還可以通過(guò)LD-PRELOAD變量讓開(kāi)發(fā)人員可以使用自己的程序庫(kù)中的模塊來(lái)替換系統(tǒng)模塊。
            
            同Windows系統(tǒng)一樣,在Linux中創(chuàng)建和使用動(dòng)態(tài)庫(kù)是比較容易的事情,在編譯函數(shù)庫(kù)源程序時(shí)加上-shared選項(xiàng)即可,這樣所生成的執(zhí)行程序就是動(dòng)態(tài)鏈接庫(kù)。通常這樣的程序以so為后綴,在Linux動(dòng)態(tài)庫(kù)程序設(shè)計(jì)過(guò)程中,通常流程是編寫(xiě)用戶的接口文件,通常是.h文件,編寫(xiě)實(shí)際的函數(shù)文件,以.c或.cpp為后綴,再編寫(xiě)makefile文件。對(duì)于較小的動(dòng)態(tài)庫(kù)程序可以不用如此,但這樣設(shè)計(jì)使程序更加合理。
            
            編譯生成動(dòng)態(tài)連接庫(kù)后,進(jìn)而可以在程序中進(jìn)行調(diào)用。在Linux中,可以采用多種調(diào)用方式,同Windows的系統(tǒng)目錄(..\system32等)一樣,可以將動(dòng)態(tài)庫(kù)文件拷貝到/lib目錄或者在/lib目錄里面建立符號(hào)連接,以便所有用戶使用。下面介紹Linux調(diào)用動(dòng)態(tài)庫(kù)經(jīng)常使用的函數(shù),但在使用動(dòng)態(tài)庫(kù)時(shí),源程序必須包含dlfcn.h頭文件,該文件定義調(diào)用動(dòng)態(tài)鏈接庫(kù)的函數(shù)的原型。
            
            (1)_打開(kāi)動(dòng)態(tài)鏈接庫(kù):dlopen,函數(shù)原型void *dlopen (const char *filename, int flag);
            dlopen用于打開(kāi)指定名字(filename)的動(dòng)態(tài)鏈接庫(kù),并返回操作句柄。
            
            (2)取函數(shù)執(zhí)行地址:dlsym,函數(shù)原型為: void *dlsym(void *handle, char *symbol);
            dlsym根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄(handle)與符號(hào)(symbol),返回符號(hào)對(duì)應(yīng)的函數(shù)的執(zhí)行代碼地址。
            
            (3)關(guān)閉動(dòng)態(tài)鏈接庫(kù):dlclose,函數(shù)原型為: int dlclose (void *handle);
            dlclose用于關(guān)閉指定句柄的動(dòng)態(tài)鏈接庫(kù),只有當(dāng)此動(dòng)態(tài)鏈接庫(kù)的使用計(jì)數(shù)為0時(shí),才會(huì)真正被系統(tǒng)卸載。
            
            (4)動(dòng)態(tài)庫(kù)錯(cuò)誤函數(shù):dlerror,函數(shù)原型為: const char *dlerror(void); 當(dāng)動(dòng)態(tài)鏈接庫(kù)操作函數(shù)執(zhí)行失敗時(shí),dlerror可以返回出錯(cuò)信息,返回值為NULL時(shí)表示操作函數(shù)執(zhí)行成功。
            
            在取到函數(shù)執(zhí)行地址后,就可以在動(dòng)態(tài)庫(kù)的使用程序里面根據(jù)動(dòng)態(tài)庫(kù)提供的函數(shù)接口聲明調(diào)用動(dòng)態(tài)庫(kù)里面的函數(shù)。在編寫(xiě)調(diào)用動(dòng)態(tài)庫(kù)的程序的makefile文件時(shí),需要加入編譯選項(xiàng)-rdynamic和-ldl。
            
            除了采用這種方式編寫(xiě)和調(diào)用動(dòng)態(tài)庫(kù)之外,Linux操作系統(tǒng)也提供了一種更為方便的動(dòng)態(tài)庫(kù)調(diào)用方式,也方便了其它程序調(diào)用,這種方式與Windows系統(tǒng)的隱式鏈接類(lèi)似。其動(dòng)態(tài)庫(kù)命名方式為“lib*.so.*”。在這個(gè)命名方式中,第一個(gè)*表示動(dòng)態(tài)鏈接庫(kù)的庫(kù)名,第二個(gè)*通常表示該動(dòng)態(tài)庫(kù)的版本號(hào),也可以沒(méi)有版本號(hào)。在這種調(diào)用方式中,需要維護(hù)動(dòng)態(tài)鏈接庫(kù)的配置文件/etc/ld.so.conf來(lái)讓動(dòng)態(tài)鏈接庫(kù)為系統(tǒng)所使用,通常將動(dòng)態(tài)鏈接庫(kù)所在目錄名追加到動(dòng)態(tài)鏈接庫(kù)配置文件中。如具有X window窗口系統(tǒng)發(fā)行版該文件中都具有/usr/X11R6/lib,它指向X window窗口系統(tǒng)的動(dòng)態(tài)鏈接庫(kù)所在目錄。為了使動(dòng)態(tài)鏈接庫(kù)能為系統(tǒng)所共享,還需運(yùn)行動(dòng)態(tài)鏈接庫(kù)的管理命令./sbin/ldconfig。在編譯所引用的動(dòng)態(tài)庫(kù)時(shí),可以在gcc采用 ?l或-L選項(xiàng)或直接引用所需的動(dòng)態(tài)鏈接庫(kù)方式進(jìn)行編譯。在Linux里面,可以采用ldd命令來(lái)檢查程序依賴共享庫(kù)。
            
            3、兩種系統(tǒng)動(dòng)態(tài)庫(kù)比較分析
            
            Windows和Linux采用動(dòng)態(tài)鏈接庫(kù)技術(shù)目的是基本一致的,但由于操作系統(tǒng)的不同,他們?cè)谠S多方面還是不盡相同,下面從以下幾個(gè)方面進(jìn)行闡述。
            
            (1)動(dòng)態(tài)庫(kù)程序編寫(xiě),在Windows系統(tǒng)下的執(zhí)行文件格式是PE格式,動(dòng)態(tài)庫(kù)需要一個(gè)DllMain函數(shù)作為初始化的人口,通常在導(dǎo)出函數(shù)的聲明時(shí)需要有_declspec(dllexport)關(guān)鍵字。Linux下的gcc編譯的執(zhí)行文件默認(rèn)是ELF格式,不需要初始化入口,亦不需要到函數(shù)做特別聲明,編寫(xiě)比較方便。
            
            (2)動(dòng)態(tài)庫(kù)編譯,在windows系統(tǒng)下面,有方便的調(diào)試編譯環(huán)境,通常不用自己去編寫(xiě)makefile文件,但在linux下面,需要自己動(dòng)手去編寫(xiě)makefile文件,因此,必須掌握一定的makefile編寫(xiě)技巧,另外,通常Linux編譯規(guī)則相對(duì)嚴(yán)格。
            
            (3)動(dòng)態(tài)庫(kù)調(diào)用方面,Windows和Linux對(duì)其下編制的動(dòng)態(tài)庫(kù)都可以采用顯式調(diào)用或隱式調(diào)用,但具體的調(diào)用方式也不盡相同。
            
            (4)動(dòng)態(tài)庫(kù)輸出函數(shù)查看,在Windows中,有許多工具和軟件可以進(jìn)行查看DLL中所輸出的函數(shù),例如命令行方式的dumpbin以及VC++工具中的DEPENDS程序。在Linux系統(tǒng)中通常采用nm來(lái)查看輸出函數(shù),也可以使用ldd查看程序隱式鏈接的共享對(duì)象文件。
            
            (5)對(duì)操作系統(tǒng)的依賴,這兩種動(dòng)態(tài)庫(kù)運(yùn)行依賴于各自的操作系統(tǒng),不能跨平臺(tái)使用。因此,對(duì)于實(shí)現(xiàn)相同功能的動(dòng)態(tài)庫(kù),必須為兩種不同的操作系統(tǒng)提供不同的動(dòng)態(tài)庫(kù)版本。
            
            4、動(dòng)態(tài)庫(kù)移植方法
            
            如果要編制在兩個(gè)系統(tǒng)中都能使用的動(dòng)態(tài)鏈接庫(kù),通常會(huì)先選擇在Windows的VC++提供的調(diào)試環(huán)境中完成初始的開(kāi)發(fā),畢



          posted @ 2009-01-21 15:56 Picasso 閱讀(14929) | 評(píng)論 (0)編輯 收藏

          轉(zhuǎn)貼:ORA-01034 ORA-27121 錯(cuò)誤

          ORA-01034: ORACLE not available
          ORA-27121: unable to determine size of shared memory segment
          Linux Error: 13: Permission denied

          主要是因?yàn)閛racle安裝程序沒(méi)有給oracle這個(gè)可執(zhí)行程序設(shè)置正確的setuid。這樣設(shè)置一下:

          $ cd $ORACLE_HOME/bin
          $ chmod 6751 oracle

          結(jié)果類(lèi)似這樣就行了。

          $ ls -l $ORACLE_HOME/bin/oracle
          -rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle


          ========================

          ORA-01034 ORA-27121 13: Permission denied

          ORA-01034

          ORA-27121

          Error: 13: Permission denied

          雙實(shí)例 兩個(gè)實(shí)例

          日月明王      http://sunmoonking.spaces.live.com

          環(huán)境               
          HP-UX jmc080 B.11.11 U 9000/800 1805586595 unlimited-user license
           
          SQL*Plus: Release 9.2.0.1.0 - Production on Mon Oct 16 16:48:45 2006
          Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
          Connected to:
          Oracle9i Enterprise Edition Release 9.2.0.1.0 - 64bit Production
          With the Partitioning, OLAP and Oracle Data Mining options
          JServer Release 9.2.0.1.0 – Production
          裝兩個(gè)數(shù)據(jù)庫(kù)db1db2,分別有兩個(gè)用戶db1userdb2user,分別屬于ORADBA1,ORADBA2,共同屬于oragroup安裝組。裝好兩個(gè)庫(kù)后出現(xiàn)如下錯(cuò)誤
          現(xiàn)象
          SQL> connect db2user/db2user@db2
          ERROR:
          ORA-01034: ORACLE not available
          ORA-27121: unable to determine size of shared memory segment
          HP-UX Error: 13: Permission denied
          此時(shí)
          $ ls -alt $ORACLE_HOME/bin/oracle
           
           Warning! One or more of your selected locales are not available.
           Please invoke the commands "locale" and "locale -a" to verify your
           selections and the available locales.
           
           Continuing processing using the "C" locale.
           
          -rwsrwsrwx   1 oracle1    oragroup   77765688 Sep  7 16:00 /usr/sap3/oracle/product/920/bin/oracle    (原權(quán)限是6751
          如果把/usr/sap3/oracle/product/920/bin/oracle的所有者改成oracle2則可以啟動(dòng)DB2,但是DB1卻出現(xiàn)同樣錯(cuò)誤,無(wú)法連接。于是判斷是某個(gè)文件的權(quán)限不對(duì)。于是一步一步檢查。
          看誰(shuí)擁有內(nèi)存
          $ ipcs -a
          IPC status from /dev/kmem as of Mon Oct 16 18:05:13 2006
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP CBYTES  QNUM QBYTES LSPID LRPID   STIME    RTIME    CTIME
          Message Queues:
          q          0 0x3c200731 -Rrw--w--w-      root      root      root      root     0     0  65535     0     0 no-entry no-entry 19:46:07
          q          1 0x3e200731 --rw-r--r--      root      root      root      root     0     0    264     0     0 no-entry no-entry 19:46:07
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP NATTCH      SEGSZ  CPID  LPID   ATIME    DTIME    CTIME
          Shared Memory:
          m          0 0x412007a8 --rw-rw-rw-      root      root      root      root      0        348   607   607 19:46:17 19:46:17 19:46:11
          m          1 0x4e0c0002 --rw-rw-rw-      root      root      root      root      1      61760   607   607 19:46:13 19:46:17 19:46:11
          m          2 0x411809a4 --rw-rw-rw-      root      root      root      root      1       8192   607   619 19:46:13 19:46:11 19:46:11
          m          3 0x30203ebc --rw-rw-rw-      root      root      root      root      2    1048576  1282  1302 19:49:19 no-entry 19:48:40
          m      17412 0x5e14045d --rw-------      root      root      root      root      1        512  1667  1667 19:49:13 no-entry 19:49:13
          m     312325 0x7bf2fe68 --rw-------   oracle1     users   oracle1     users     13  873955328 20914 22016 18:04:49 18:04:49 16:22:30
          m       4102 0x36ba48e8 --rw-rw----   oracle2     users   oracle2     users     14  706183168 21014 21991 18:03:37 18:03:37 16:26:16
          T         ID     KEY        MODE        OWNER     GROUP   CREATOR    CGROUP NSEMS   OTIME    CTIME
          Semaphores:
          s          0 0x412007a8 --ra-ra-ra-      root      root      root      root     1 19:46:17 19:46:11
          s          1 0x4e0c0002 --ra-ra-ra-      root      root      root      root     2 19:46:13 19:46:11
          s          2 0x411809a4 --ra-ra-ra-      root      root      root      root     2 no-entry 19:46:11
          s          3 0x00446f6e --ra-r--r--      root      root      root      root     1 no-entry 19:46:50
          s          4 0x00446f6d --ra-r--r--      root      root      root      root     1 no-entry 19:46:50
          s          5 0x01090522 --ra-r--r--      root      root      root      root     1 no-entry 19:47:09
          s          6 0x41207339 --ra-ra-ra-      root      root      root      root     1 19:48:35 19:48:35
          s          7 0x31203ebc --ra-ra-ra-      root      root      root      root     1 19:49:19 19:48:40
          s          8 0x611804f5 --ra-ra-ra-      root      root      root      root     1 19:53:03 19:49:04
          s          9 0x731804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:49:04
          s         10 0x701804f5 --ra-ra-ra-      root      root      root      root     1 19:53:43 19:49:04
          s         11 0x691804f5 --ra-ra-ra-      root      root      root      root     1 19:53:01 19:49:04
          s         12 0x751804f5 --ra-ra-ra-      root      root      root      root     1 19:49:04 19:49:04
          s         13 0x631804f5 --ra-ra-ra-      root      root      root      root     1 19:49:04 19:49:04
          s         14 0x641804f5 --ra-ra-ra-      root      root      root      root     1 19:53:04 19:49:04
          s         15 0x661804f5 --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:04
          s         16 0x6c1804f5 --ra-ra-ra-      root      root      root      root     1 19:53:03 19:49:04
          s         17 0x6d1804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:49:04
          s         18 0x6f1804f5 --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:04
          s         19 0x410c01e0 --ra-ra-ra-      root      root      root      root     1 19:49:09 19:49:09
          s         20 0x00000001 --ra-ra-ra-      root      root      root      root     1 19:49:49 19:49:13
          s         21 0x4528e5bf --ra-ra-ra-      root      root      root      root     1 no-entry 19:49:19
          s         22 0x4528e5c0 --ra-ra-ra-      root      root      root      root     1 19:49:19 19:49:19
          s         23 0x521804f5 --ra-ra-ra-      root      root      root      root     1 19:59:47 19:53:04
          s     182624 0xfc6c0898 --ra-------   oracle1     users   oracle1     users   154 18:05:06 16:22:32
          s      49825 0xa01e08b0 --ra-ra----   oracle2     users   oracle2     users   154 18:04:44 16:26:17
          沒(méi)看出什么明顯問(wèn)題。
          首先設(shè)置UMAKS 000
          在設(shè)置/var/opt/oracle/oratab
          DB1:/usr/sap3/oracle/product/920:Y
          DB2:/usr/sap3/oracle/product/920:Y 
          chown -R oracle1:oragroup $ORACLE_BASE
          chmod -R 777 $ORACLE_BASE
          chmod 6777 $ORACLE_HOME/bin/oracle

          posted @ 2009-01-11 14:55 Picasso 閱讀(2329) | 評(píng)論 (0)編輯 收藏

          轉(zhuǎn)貼: 讓進(jìn)程在后臺(tái)可靠運(yùn)行的幾種方法

          讓進(jìn)程在后臺(tái)可靠運(yùn)行的幾種方法

          想讓進(jìn)程在斷開(kāi)連接后依然保持運(yùn)行?如果該進(jìn)程已經(jīng)開(kāi)始運(yùn)行了該如何補(bǔ)救? 如果有大量這類(lèi)需求如何簡(jiǎn)化操作?

              我們經(jīng)常會(huì)碰到這樣的問(wèn)題,用 telnet/ssh 登錄了遠(yuǎn)程的 Linux 服務(wù)器,運(yùn)行了一些耗時(shí)較長(zhǎng)的任務(wù), 結(jié)果卻由于網(wǎng)絡(luò)的不穩(wěn)定導(dǎo)致任務(wù)中途失敗。如何讓命令提交后不受本地關(guān)閉終端窗口/網(wǎng)絡(luò)斷開(kāi)連接的干擾呢?下面舉了一些例子, 您可以針對(duì)不同的場(chǎng)景選擇不同的方式來(lái)處理這個(gè)問(wèn)題。

              nohup/setsid/&

              場(chǎng)景:

              如果只是臨時(shí)有一個(gè)命令需要長(zhǎng)時(shí)間運(yùn)行,什么方法能最簡(jiǎn)便的保證它在后臺(tái)穩(wěn)定運(yùn)行呢?

              解決方法:

              我們知道,當(dāng)用戶注銷(xiāo)(logout)或者網(wǎng)絡(luò)斷開(kāi)時(shí),終端會(huì)收到 HUP(hangup)信號(hào)從而關(guān)閉其所有子進(jìn)程。因此,我們的解決辦法就有兩種途徑:要么讓進(jìn)程忽略 HUP 信號(hào),要么讓進(jìn)程運(yùn)行在新的會(huì)話里從而成為不屬于此終端的子進(jìn)程。

              1. nohup

              nohup 無(wú)疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup(在 Unix 的早期版本中,每個(gè)終端都會(huì)通過(guò) modem 和系統(tǒng)通訊。當(dāng)用戶 logout 時(shí),modem 就會(huì)掛斷(hang up)電話。 同理,當(dāng) modem 斷開(kāi)連接時(shí),就會(huì)給終端發(fā)送 hangup 信號(hào)來(lái)通知其關(guān)閉所有子進(jìn)程。) 信號(hào)。讓我們先來(lái)看一下 nohup 的幫助信息
          NOHUP(1)                        User Commands                        NOHUP(1)

          NAME
                 nohup - run a command immune to hangups, with output to a non-tty

          SYNOPSIS
                 nohup COMMAND [ARG]...
                 nohup OPTION

          DESCRIPTION
                 Run COMMAND, ignoring hangup signals.

                 --help display this help and exit

                 --version
                        output version information and exit 


              可見(jiàn),nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤缺省會(huì)被重定向到 nohup.out 文件中。一般我們可在結(jié)尾加上"&"來(lái)將命令同時(shí)放入后臺(tái)運(yùn)行,也可用">filename 2>&1"來(lái)更改缺省的重定向文件名。

              nohup 示例

             [root@pvcent107 ~]# nohup ping www.ibm.com &
          [1] 3059
          nohup: appending output to `nohup.out'
          [root@pvcent107 ~]# ps -ef |grep 3059
          root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
          root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
          [root@pvcent107 ~]#


              2。setsid

              nohup 無(wú)疑能通過(guò)忽略 HUP 信號(hào)來(lái)使我們的進(jìn)程避免中途被中斷,但如果我們換個(gè)角度思考,如果我們的進(jìn)程不屬于接受 HUP 信號(hào)的終端的子進(jìn)程,那么自然也就不會(huì)受到 HUP 信號(hào)的影響了。setsid 就能幫助我們做到這一點(diǎn)。讓我們先來(lái)看一下 setsid 的幫助信息:

              
          SETSID(8) Linux Programmer’s Manual SETSID(8) NAME setsid - run a program in a new session SYNOPSIS setsid program [ arg ... ] DESCRIPTION setsid runs a program in a new session. 


              可見(jiàn) setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。

              setsid 示例

           [root@pvcent107 ~]# setsid ping www.ibm.com
          [root@pvcent107 ~]# ps -ef |grep www.ibm.com
          root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com
          root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
          [root@pvcent107 ~]#   


              值得注意的是,上例中我們的進(jìn)程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進(jìn)程 ID),并不是當(dāng)前終端的進(jìn)程 ID。請(qǐng)將此例與nohup 例中的父 ID 做比較。

              3。&
              這里還有一個(gè)關(guān)于 subshell 的小技巧。我們知道,將一個(gè)或多個(gè)命名包含在“()”中就能讓這些命令在子 shell 中運(yùn)行中,從而擴(kuò)展出很多有趣的功能,我們現(xiàn)在要討論的就是其中之一。

              當(dāng)我們將"&"也放入“()”內(nèi)之后,我們就會(huì)發(fā)現(xiàn)所提交的作業(yè)并不在作業(yè)列表中,也就是說(shuō),是無(wú)法通過(guò)jobs來(lái)查看的。讓我們來(lái)看看為什么這樣就能躲過(guò) HUP 信號(hào)的影響吧。

              subshell 示例

               [root@pvcent107 ~]# (ping www.ibm.com &)
          [root@pvcent107 ~]# ps -ef |grep www.ibm.com
          root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
          root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
          [root@pvcent107 ~]#   


              從上例中可以看出,新提交的進(jìn)程的父 ID(PPID)為1(init 進(jìn)程的 PID),并不是當(dāng)前終端的進(jìn)程 ID。因此并不屬于當(dāng)前終端的子進(jìn)程,從而也就不會(huì)受到當(dāng)前終端的 HUP 信號(hào)的影響了
          screen

              場(chǎng)景:

              我們已經(jīng)知道了如何讓進(jìn)程免受 HUP 信號(hào)的影響,但是如果有大量這種命令需要在穩(wěn)定的后臺(tái)里運(yùn)行,如何避免對(duì)每條命令都做這樣的操作呢?

              解決方法:

              此時(shí)最方便的方法就是 screen 了。簡(jiǎn)單的說(shuō),screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個(gè)真實(shí)終端下運(yùn)行多個(gè)全屏的偽終端。screen 的參數(shù)很多,具有很強(qiáng)大的功能,我們?cè)诖藘H介紹其常用功能以及簡(jiǎn)要分析一下為什么使用 screen 能夠避免 HUP 信號(hào)的影響。我們先看一下 screen 的幫助信息:

               SCREEN(1)                                                           SCREEN(1)

          NAME
                 screen - screen manager with VT100/ANSI terminal emulation

          SYNOPSIS
                 screen [ -options ] [ cmd [ args ] ]
                 screen -r [[pid.]tty[.host]]
                 screen -r sessionowner/[[pid.]tty[.host]]

          DESCRIPTION
                 Screen  is  a  full-screen  window manager that multiplexes a physical
                 terminal between several  processes  (typically  interactive  shells).
                 Each  virtual  terminal provides the functions of a DEC VT100 terminal
                 and, in addition, several control functions from the  ISO  6429  (ECMA
                 48,  ANSI  X3.64)  and ISO 2022 standards (e.g. insert/delete line and
                 support for multiple character sets).  There is a  scrollback  history
                 buffer  for  each virtual terminal and a copy-and-paste mechanism that
                 allows moving text regions between windows.


              使用 screen 很方便,有以下幾個(gè)常用選項(xiàng):

              用screen -dmS session name 來(lái)建立一個(gè)處于斷開(kāi)模式下的會(huì)話(并指定其會(huì)話名)。
              用screen -list 來(lái)列出所有會(huì)話。
              用screen -r session name 來(lái)重新連接指定會(huì)話。
              用快捷鍵CTRL-a d 來(lái)暫時(shí)斷開(kāi)當(dāng)前會(huì)話。

              screen 示例

               [root@pvcent107 ~]# screen -dmS Urumchi
          [root@pvcent107 ~]# screen -list
          There is a screen on:
                  12842.Urumchi   (Detached)
          1 Socket in /tmp/screens/S-root.

          [root@pvcent107 ~]# screen -r Urumchi


              當(dāng)我們用“-r”連接到 screen 會(huì)話后,我們就可以在這個(gè)偽終端里面為所欲為,再也不用擔(dān)心 HUP 信號(hào)會(huì)對(duì)我們的進(jìn)程造成影響,也不用給每個(gè)命令前都加上“nohup”或者“setsid”了。這是為什么呢?讓我來(lái)看一下下面兩個(gè)例子吧。

              1. 未使用 screen 時(shí)新進(jìn)程的進(jìn)程樹(shù)

               [root@pvcent107 ~]# ping www.google.com &
          [1] 9499
          [root@pvcent107 ~]# pstree -H 9499
          init─┬─Xvnc
               ├─acpid
               ├─atd
               ├─2*[sendmail]
               ├─sshd─┬─sshd───bash───pstree
               │      └─sshd───bash───ping
                      


              我們可以看出,未使用 screen 時(shí)我們所處的 bash 是 sshd 的子進(jìn)程,當(dāng) ssh 斷開(kāi)連接時(shí),HUP 信號(hào)自然會(huì)影響到它下面的所有子進(jìn)程(包括我們新建立的 ping 進(jìn)程)。

              2. 使用了 screen 后新進(jìn)程的進(jìn)程樹(shù)

               [root@pvcent107 ~]# screen -r Urumchi
          [root@pvcent107 ~]# ping www.ibm.com &
          [1] 9488
          [root@pvcent107 ~]# pstree -H 9488
          init─┬─Xvnc
               ├─acpid
               ├─atd
               ├─screen───bash───ping
               ├─2*[sendmail]


              而使用了 screen 后就不同了,此時(shí) bash 是 screen 的子進(jìn)程,而 screen 是 init(PID為1)的子進(jìn)程。那么當(dāng) ssh 斷開(kāi)連接時(shí),HUP 信號(hào)自然不會(huì)影響到 screen 下面的子進(jìn)程了。

              總結(jié)

              現(xiàn)在幾種方法已經(jīng)介紹完畢,我們可以根據(jù)不同的場(chǎng)景來(lái)選擇不同的方案。nohup/setsid 無(wú)疑是臨時(shí)需要時(shí)最方便的方法,disown 能幫助我們來(lái)事后補(bǔ)救當(dāng)前已經(jīng)在運(yùn)行了的作業(yè),而 screen 則是在大批量操作時(shí)不二的選擇了

          posted @ 2009-01-10 13:48 Picasso 閱讀(285) | 評(píng)論 (0)編輯 收藏

          更改Suse 主機(jī)名、IP

          Q: 在SLES8中如何修改主機(jī)名(hostname)
          A: SLES8中可以用yast network來(lái)修改主機(jī)名(hostname),也可以通過(guò)修改配置文件的方式并運(yùn)行命令
          實(shí)現(xiàn)這個(gè)目的

          方法1. 通過(guò)yast2管理工具進(jìn)行配置
          在console中運(yùn)行yast2工具修改主機(jī)名(hostname)
          # yast2 network
          對(duì)于配置未經(jīng)配置的網(wǎng)卡
          "Network cards configuration"中"Network cards configuration"中“Configure...”
          對(duì)于修改已配置網(wǎng)卡的設(shè)置
          "Network cards configuration"中"Network cards configuration"中“Changev...”

          “Network address setup”中“Detailed settings”單擊“Host name and name server”
          在“Host name”輸入框中輸入主機(jī)名,在“Domain name”中數(shù)入域名,如果沒(méi)有域名,接受缺省的
          “local”

          方法2. 通過(guò)修改配置文件的方式并運(yùn)行命令修改主機(jī)名
          修改/etc/HOSTNAME文件,在此文件中保存主機(jī)名,例如:
          linuxserv1

          然后運(yùn)行命令設(shè)置主機(jī)名
          # /etc/rc.d/boot.localnet start

          方法3. 運(yùn)行 sysctl 動(dòng)態(tài)改變主機(jī)名
          # sysctl -w kernel.hostname=linuxserv1



          Q:如何更改網(wǎng)卡配置IP

          # vi /etc/sysconfig/network/ifcfg-eth-id-00\:0d\:61\:cd\:31\:f2


          BOOTPROTO='static'
          BROADCAST=''
          ETHTOOL_OPTIONS=''
          IPADDR='192.168.1.70'
          MTU=''
          NAME='Giga-byte GA-7VM400M/7VT600 Motherboard'
          NETMASK='255.255.255.0'
          NETWORK=''
          REMOTE_IPADDR=''
          STARTMODE='auto'
          UNIQUE='rBUF.0ayJ55PfLqC'
          USERCONTROL='no'
          _nm_name='bus-pci-0000:01:05.0'

          posted @ 2009-01-04 16:20 Picasso 閱讀(3082) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 娱乐| 沅江市| 沈阳市| 基隆市| 温泉县| 德兴市| 浮山县| 班戈县| 马关县| 岳普湖县| 保山市| 台湾省| 格尔木市| 富平县| 合阳县| 河池市| 合肥市| 蓬安县| 漳平市| 巴东县| 西丰县| 策勒县| 南漳县| 南皮县| 望谟县| 淳安县| 雷波县| 如皋市| 罗甸县| 玉环县| 区。| 康保县| 江北区| 鲜城| 普陀区| 都昌县| 郑州市| 德江县| 长武县| 英吉沙县| 青河县|