成長空間

          MiLife

          常用鏈接

          統計

          積分與排名

          Automation Testing Development

          最新評論

          2007年7月25日 #

          gdb

          基礎:
          http://blog.csai.cn/user3/50125/archives/2009/35140.html

          多進程:
          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) | 評論 (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) | 評論 (0)編輯 收藏

          轉載:Linux內存管理(上)

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

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

          Linux 關于動態鏈接庫以及靜態鏈接庫的一些概念

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

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

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



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

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



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

          轉貼:ORA-01034 ORA-27121 錯誤

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

          主要是因為oracle安裝程序沒有給oracle這個可執行程序設置正確的setuid。這樣設置一下:

          $ cd $ORACLE_HOME/bin
          $ chmod 6751 oracle

          結果類似這樣就行了。

          $ 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

          雙實例 兩個實例

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

          環境               
          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
          裝兩個數據庫db1db2,分別有兩個用戶db1userdb2user,分別屬于ORADBA1,ORADBA2,共同屬于oragroup安裝組。裝好兩個庫后出現如下錯誤
          現象
          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
          此時
          $ 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    (原權限是6751
          如果把/usr/sap3/oracle/product/920/bin/oracle的所有者改成oracle2則可以啟動DB2,但是DB1卻出現同樣錯誤,無法連接。于是判斷是某個文件的權限不對。于是一步一步檢查。
          看誰擁有內存
          $ 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
          沒看出什么明顯問題。
          首先設置UMAKS 000
          在設置/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) | 評論 (0)編輯 收藏

          轉貼: 讓進程在后臺可靠運行的幾種方法

          讓進程在后臺可靠運行的幾種方法

          想讓進程在斷開連接后依然保持運行?如果該進程已經開始運行了該如何補救? 如果有大量這類需求如何簡化操作?

              我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由于網絡的不穩定導致任務中途失敗。如何讓命令提交后不受本地關閉終端窗口/網絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。

              nohup/setsid/&

              場景:

              如果只是臨時有一個命令需要長時間運行,什么方法能最簡便的保證它在后臺穩定運行呢?

              解決方法:

              我們知道,當用戶注銷(logout)或者網絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬于此終端的子進程。

              1. nohup

              nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup(在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程。) 信號。讓我們先來看一下 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 


              可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 文件中。一般我們可在結尾加上"&"來將命令同時放入后臺運行,也可用">filename 2>&1"來更改缺省的重定向文件名。

              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 無疑能通過忽略 HUP 信號來使我們的進程避免中途被中斷,但如果我們換個角度思考,如果我們的進程不屬于接受 HUP 信號的終端的子進程,那么自然也就不會受到 HUP 信號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 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. 


              可見 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 ~]#   


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

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

              當我們將"&"也放入“()”內之后,我們就會發現所提交的作業并不在作業列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什么這樣就能躲過 HUP 信號的影響吧。

              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 ~]#   


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

              場景:

              我們已經知道了如何讓進程免受 HUP 信號的影響,但是如果有大量這種命令需要在穩定的后臺里運行,如何避免對每條命令都做這樣的操作呢?

              解決方法:

              此時最方便的方法就是 screen 了。簡單的說,screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個真實終端下運行多個全屏的偽終端。screen 的參數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什么使用 screen 能夠避免 HUP 信號的影響。我們先看一下 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 很方便,有以下幾個常用選項:

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

              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


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

              1. 未使用 screen 時新進程的進程樹

               [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 時我們所處的 bash 是 sshd 的子進程,當 ssh 斷開連接時,HUP 信號自然會影響到它下面的所有子進程(包括我們新建立的 ping 進程)。

              2. 使用了 screen 后新進程的進程樹

               [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 后就不同了,此時 bash 是 screen 的子進程,而 screen 是 init(PID為1)的子進程。那么當 ssh 斷開連接時,HUP 信號自然不會影響到 screen 下面的子進程了。

              總結

              現在幾種方法已經介紹完畢,我們可以根據不同的場景來選擇不同的方案。nohup/setsid 無疑是臨時需要時最方便的方法,disown 能幫助我們來事后補救當前已經在運行了的作業,而 screen 則是在大批量操作時不二的選擇了

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

          更改Suse 主機名、IP

          Q: 在SLES8中如何修改主機名(hostname)
          A: SLES8中可以用yast network來修改主機名(hostname),也可以通過修改配置文件的方式并運行命令
          實現這個目的

          方法1. 通過yast2管理工具進行配置
          在console中運行yast2工具修改主機名(hostname)
          # yast2 network
          對于配置未經配置的網卡
          "Network cards configuration"中"Network cards configuration"中“Configure...”
          對于修改已配置網卡的設置
          "Network cards configuration"中"Network cards configuration"中“Changev...”

          “Network address setup”中“Detailed settings”單擊“Host name and name server”
          在“Host name”輸入框中輸入主機名,在“Domain name”中數入域名,如果沒有域名,接受缺省的
          “local”

          方法2. 通過修改配置文件的方式并運行命令修改主機名
          修改/etc/HOSTNAME文件,在此文件中保存主機名,例如:
          linuxserv1

          然后運行命令設置主機名
          # /etc/rc.d/boot.localnet start

          方法3. 運行 sysctl 動態改變主機名
          # sysctl -w kernel.hostname=linuxserv1



          Q:如何更改網卡配置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) | 評論 (0)編輯 收藏

          AIX 下的 core dump 分析入門

               摘要:   http://www.ibm.com/developerworks/cn/aix/library/0806_chench_core/index.html ...  閱讀全文

          posted @ 2008-11-10 10:52 Picasso 閱讀(1555) | 評論 (0)編輯 收藏

          轉載:ldconfig幾個需要注意的地方

               摘要:   閱讀全文

          posted @ 2008-10-07 22:24 Picasso 閱讀(494) | 評論 (0)編輯 收藏

          轉載: 用vi 編輯文件時“終端太寬”(Terminal too wide)

              
          用vi 編輯文件時“終端太寬”(Terminal too wide)

          #stty -a    check you columns setting .
          #stty columns 132    may solve it .

          posted @ 2008-09-02 09:07 Picasso| 編輯 收藏

          轉載: root用戶ftp-telnet 登陸設置

          root用戶ftp-telnet 登陸設置

          root用戶ftp-telnet 登陸設置
          --------------------------------------
          Linux 精華---root用戶ftp/telnet 登陸設置  (筆者原版---共享)
          --------------------------------------------------------
          筆者以FedCore 4(2.6.11)為藍本,一般情況下系統默認的 root用戶不能遠程ftp 和 telnet 服務器.網絡上有些更改
          遠程登陸的文章,筆者還是認為都不夠全面,經過自己一個小時的折騰終于解決了.
          1),解決root用戶 ftp登陸的問題
            一般情況下,由于種種原因ftp是不讓root用戶遠程登陸,但只要你修改以個文件就可以登陸了.
             a ,去掉或注釋掉  /etc/vsftpd/ftpusers 中的root
             b ,去掉或注釋掉  /etc/vsftpd/user_list  中的root
          2),修改ftp的默認的路徑
          我的硬盤空間有限,如何把帳號ftp默認的路徑/var/ftp更改到別處?或者是,我的linux所有的目錄都放在/根分區,因為空間緊張,我能否把ftp這個用戶的默認路徑放到別的分區?
          可以,應該如下操作!
          首先要把ftp這個用戶刪除
            #userdel -r ftp
          會有錯誤信息,不過不用理,這是正常的。
          然后我們再把這個用戶添加上,比如我想為帳號ftp的家目錄設置在/mnt/LinG/ftp,我們就可以如下操作
            [root@linuxsir001 root]# mkdir /root/ftp
             [root@linuxsir001 root]# adduser -d /root/ftp -g ftp -s /sbin/nologin ftp
          僅僅是這樣做還不行,因為這樣還是不能讓匿名用戶找到它的家目錄,所以我們必須改變/mnt/LinG/ftp這個目錄的權限。
            [root@linuxsir001 root]# chmod 755 /root/ftp/  
              [root@linuxsir001 root]# chown -R root.root /root/ftp/
          3),root用戶登陸 telnet
            a,檢查你的服務器是否安裝 telnet 服務器
             rpm -qa | grep  telnet-server[root@fedorasvr tmp]# ls
             telnet-server-0.17-35.i386.rpm
          [root@fedorasvr tmp]# rpm -i telnet-server-0.17-35.i386.rpm
          warning: telnet-server-0.17-35.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
          error: Failed dependencies:
          xinetd is needed by telnet-server-0.17-35.i386
          -------------哦是什么出錯了呢?????
          檢查,檢查可能是沒有安裝 xinetd ,因為linux的安裝包依賴性可能強,好安裝一下了,在安1.rpm -ivh xinetd-2.3.13-6.i386.rpm
          2.service xinetd start
          3.rpm-ivh telnet-server-0.17-35.i386.rpm
          4.chkconfig telnet on
          裝telnet-server 等
          測試 telnet 服務器已經安裝好了,
             b),開啟root用戶的telnet功能
              1,編輯/etc/default/login文件.
                  添加內容:CONSOLE=/dev/console
                  2,編輯/etc/securetty   文件,加上下面幾行:   
              pts/0   
                  pts/1   
                  pts/2   
                  pts/3
                     測試root用戶直接telnet登陸成功,
                特別提示:對了最好不要使用root用戶telnet 登陸,也不要使用telnet功能,因為它太不安全了,最好使用 ssh2登陸.
          ----------------------------------------------------
          Linux 精華---root用戶ftp/telnet 登陸設置  (筆者原版---共享)
          --------------------------------------------------------
          筆者以FedCore 4(2.6.11)為藍本,一般情況下系統默認的 root用戶不能遠程ftp 和 telnet 服務器.網絡上有些更改
          遠程登陸的文章,筆者還是認為都不夠全面,經過自己一個小時的折騰終于解決了.
          1),解決root用戶 ftp登陸的問題
            一般情況下,由于種種原因ftp是不讓root用戶遠程登陸,但只要你修改以個文件就可以登陸了.
             a ,去掉或注釋掉  /etc/vsftpd/ftpusers 中的root
             b ,去掉或注釋掉  /etc/vsftpd/user_list  中的root
          2),修改ftp的默認的路徑
          我的硬盤空間有限,如何把帳號ftp默認的路徑/var/ftp更改到別處?或者是,我的linux所有的目錄都放在/根分區,因為空間緊張,我能否把ftp這個用戶的默認路徑放到別的分區?
          可以,應該如下操作!
          首先要把ftp這個用戶刪除
            #userdel -r ftp
          會有錯誤信息,不過不用理,這是正常的。
          然后我們再把這個用戶添加上,比如我想為帳號ftp的家目錄設置在/mnt/LinG/ftp,我們就可以如下操作
            [root@linuxsir001 root]# mkdir /root/ftp
             [root@linuxsir001 root]# adduser -d /root/ftp -g ftp -s /sbin/nologin ftp
          僅僅是這樣做還不行,因為這樣還是不能讓匿名用戶找到它的家目錄,所以我們必須改變/mnt/LinG/ftp這個目錄的權限。
            [root@linuxsir001 root]# chmod 755 /root/ftp/  
              [root@linuxsir001 root]# chown -R root.root /root/ftp/
          3),root用戶登陸 telnet
            a,檢查你的服務器是否安裝 telnet 服務器
             rpm -qa | grep  telnet-server[root@fedorasvr tmp]# ls
             telnet-server-0.17-35.i386.rpm
          [root@fedorasvr tmp]# rpm -i telnet-server-0.17-35.i386.rpm
          warning: telnet-server-0.17-35.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
          error: Failed dependencies:
          xinetd is needed by telnet-server-0.17-35.i386
          -------------哦是什么出錯了呢?????
          檢查,檢查可能是沒有安裝 xinetd ,因為linux的安裝包依賴性可能強,好安裝一下了,在安1.rpm -ivh xinetd-2.3.13-6.i386.rpm
          2.service xinetd start
          3.rpm-ivh telnet-server-0.17-35.i386.rpm
          4.chkconfig telnet on
          裝telnet-server 等
          測試 telnet 服務器已經安裝好了,
             b),開啟root用戶的telnet功能
              1,編輯/etc/default/login文件.
                  添加內容:CONSOLE=/dev/console
                  2,編輯/etc/securetty   文件,加上下面幾行:   
              pts/0   
                  pts/1   
                  pts/2   
                  pts/3
                     測試root用戶直接telnet登陸成功,
                特別提示:對了最好不要使用root用戶telnet 登陸,也不要使用telnet功能,因為它太不安全了,最好使用 ssh2登陸.
          ----------------------------------------------------

          posted @ 2008-09-01 20:22 Picasso| 編輯 收藏

          Solaris NIS NFS 配置

          一.NFS Server設置:

              啟動NFS Server服務:
          # /etc/rc3.d/S15nfs.server start

              Share目錄:
                 編輯文件/etc/dfs/dfstab:
          share -F nfs -o rw=10.0.0.13,root=10.0.0.13 /home
                 然后運行shareall將目錄share出去,或者不編輯該文件,直接在命令行輸入效果一樣.

                  查看是否成功share"
                 # dfshares
          RESOURCE                                  SERVER ACCESS    TRANSPORT
             solaris:/home                         solaris  -         -


          二.NIS設置:

              復制配置文件:
          # cp /etc/nsswitch.nis /etc/nsswitch.conf

              設置域名:
          # domainname congli
          # echo congli > /etc/defaultdomain

              初始化及啟動服務:
          # ypinit -m
          # /usr/lib/netsvc/yp/ypstart


          客戶端(Solaris 9)

          一.NFS Client設置: 

              啟動NFS Client服務:
          # /etc/rc2.d/S73nfs.client start

              編輯/etc/vfstab:
          10.0.0.12:/home - /home nfs - yes soft,bg

              把NFS文件系統掛上:
          # mountall -r


          二.NIS設置:

              復制配置文件:
          # cp /etc/nsswitch.nis /etc/nsswitch.conf

              設置域名:
          # domainname congli
          # echo congli > /etc/defaultdomain

              把NIS服務端的IP加到/etc/hosts:
          10.0.0.12       solaris

              初始化及啟動服務:
          # ypinit -m    (填上NIS服務端的hostname,Ctrl+D結束)
          # /usr/lib/netsvc/yp/ypstart

          posted @ 2008-09-01 20:18 Picasso| 編輯 收藏

          Unix Basic

               摘要: 1 UNIX起源、流派及標準 1.1 UNIX的發展簡史 60年代由麻省理工學院、通用電器公司、AT&T貝爾試驗室組成一個專家小組,研制一個MULICS,是一個靈活的交互式操作系統。 60年后期,BELL脫離該組織,失去了靈活的交互式操作系統。 1990年,有一個叫Ken.Tompson寫了一個SPACE TRAVEL的游戲,是在PDP-7上寫的,為了更有效地發揮PDP-7的強大功...  閱讀全文

          posted @ 2008-06-25 15:24 Picasso 閱讀(536) | 評論 (0)編輯 收藏

          Unix Basic

               摘要: 1 UNIX起源、流派及標準 1.1 UNIX的發展簡史 60年代由麻省理工學院、通用電器公司、AT&T貝爾試驗室組成一個專家小組,研制一個MULICS,是一個靈活的交互式操作系統。 60年后期,BELL脫離該組織,失去了靈活的交互式操作系統。 1990年,有一個叫Ken.Tompson寫了一個SPACE TRAVEL的游戲,是在PDP-7上寫的,為了更有效地發揮PDP-7的強大功...  閱讀全文

          posted @ 2008-06-25 15:18 Picasso 閱讀(243) | 評論 (0)編輯 收藏

          STL 的排序算法差異

          http://blog.csdn.net/taodm/archive/2003/04/16/15756.aspx

          posted @ 2008-01-09 15:12 Picasso 閱讀(194) | 評論 (0)編輯 收藏

          VMWare Workstation、GSX Server、ESX Server有什么區別?

          http://keith.ecjtu.com/article.asp?id=657

          總結的比較全,但對esx snapshot的功能說得不對, esx server 支持多級snapshots,應該是權限受到了控制的原因.

          posted @ 2008-01-02 16:35 Picasso 閱讀(2075) | 評論 (1)編輯 收藏

          Technical Area for new GUI design related

          ASP.net
          WCF
          Flex
          Siverlight

          Web Service
          WPF

          posted @ 2007-10-17 16:34 Picasso 閱讀(365) | 評論 (2)編輯 收藏

          使用 VMware ESX Server 在 Linux 虛擬機上安裝 DB2 Enterprise 9

          posted @ 2007-10-10 15:57 Picasso 閱讀(194) | 評論 (0)編輯 收藏

          SAS硬盤

           不知不覺已經進入06年,業界在數年前就已經提出的SAS(Serial Attached SCSI)硬盤規格也早已有成品上市,但是SAS的推廣時機在05年還不夠成熟,存儲設備提供商也只是推出幾款產品作為先頭部隊,SAS硬盤的大規模普及還要看06年,根據國外相關市場預測機構的估計,在今年,SAS硬盤將會搶占SCSI市場的三分之一,這個數目確實不小,而且這種新的硬盤設計規格也擁有更多的優勢,我們相信在06年,SAS硬盤一定會在中高端市場有所作為。因此,今天我們就來談談SAS技術和SAS硬盤。

            存儲設備的分類

            網絡存儲設備目前大致可分為3類,即高端、中端和近端(Near-Line)。高端存儲設備主要是光纖通道,應用于任務級的關鍵數據的大容量實時存儲。中端存儲設備主要是SCSI,應用于商業級的關鍵數據的大容量存儲。近端是近年來新出現的存儲領域,其產品主要是串行ATA(Serial ATA,縮寫為SATA),應用于非關鍵數據的大容量存儲,目的是替代以前使用磁帶的數據備份。由于SATA的硬盤價格越來越低,容量越來越大,可以用于數據備份。用硬盤作數據備份還有一個優點,就是攜帶和存儲方便。傳統的企業級存儲由于考慮到性能和穩定性,以SCSI硬盤和光纖通道為主要存儲平臺,ATA則多用于非關鍵性資料或桌面個人計算機上,不過SATA的興起正逐漸改變企業存儲的形式。

            前邁拓公司全球服務器產品部門營銷總監Brendan Collins表示,SAS技術將大幅改變企業內部存儲結構,并在若干年后成為存儲設備的主要標準。由于成本的降低和性能的提高,基于SAS技術的硬盤將取代SCSI硬盤甚至光纖通道,成為未來企業存儲系統或服務器硬盤的主流。

            什么是SAS

            SAS是新一代的SCSI技術,和現在流行的Serial ATA(SATA)硬盤相同,都是采用串行技術以獲得更高的傳輸速度,并通過縮短連結線改善內部空間等。SAS是并行SCSI接口之后開發出的全新接口。此接口的設計是為了改善存儲系統的效能、可用性和擴充性,提供與串行ATA (Serial ATA,縮寫為SATA)硬盤的兼容性。

            SAS的接口技術可以向下兼容SATA。SAS系統的背板(Backplane)既可以連接具有雙端口、高性能的SAS驅動器,也可以連接高容量、低成本的SATA驅動器。因為SAS驅動器的端口與SATA驅動器的端口形狀看上去類似,所以SAS驅動器和SATA驅動器可以同時存在于一個存儲系統之中。但需要注意的是,SATA系統并不兼容SAS,所以SAS驅動器不能連接到SATA背板上。由于SAS系統的兼容性,IT人員能夠運用不同接口的硬盤來滿足各類應用在容量上或效能上的需求,因此在擴充存儲系統時擁有更多的彈性,讓存儲設備發揮最大的投資效益。

            SAS技術還有簡化內部連接設計的優勢,存儲設備廠商目前投入相當多的成本以支持包括光纖通道陣列、SATA陣列等不同的存儲設備,而SAS連接技術將可以通過共用組件降低設計成本。

            SAS的特點

            串行SCSI是點到點的結構,可以建立磁盤到控制器的直接連接。具有以下特點:

            1、更好的性能:

            點到點的技術減少了地址沖突以及菊花鏈連結的減速;
            為每個設備提供了專用的信號通路來保證最大的帶寬;
            全雙工方式下的數據操作保證最有效的數據吞吐量;

            2、簡便的線纜連結:

            更細的電纜搭配更小的連接器;

            3、更好的擴展性:

            可以同時連結更多的磁盤設備。
            由于串行SCSI(SAS)是點到點的結構,因此除了提高性能之外,每個設備連接到指定的數據通路上提高了帶寬。SAS的電纜結構節省了空間,從而提高了使用SAS硬盤服務器的散熱、通風能力。一般情況下,較大的并行電纜會帶來電子干擾,SAS的電纜結構可以解決這個問題。此外SAS結構有非常好的擴展能力,最多可以連接16384個磁盤設備。

            串行SCSI(SAS)硬盤使用與S-ATA相同的接口,但是使用較多的信號,因此SAS硬盤不能與S-ATA硬盤控制器連結。SAS是通用接口,支持SAS和S-ATA,SAS控制器可以支持SAS和SATA磁盤。S-ATA使用SAS控制器的信號子集,因此SAS控制器支持S-ATA硬盤。

            初期的SAS硬盤使用2.5英寸封裝,這樣可以使機架服務器支持更多的硬盤,現在已經有廠商推出標準3.5英寸的SAS硬盤;初期產品的轉速是10000RPM,而現在15000RPM的產品也已經問世。SAS硬盤與相同轉速的SCSI硬盤相比有相同或者更好的性能。串行接口減少了線纜的尺寸,允許更快的傳輸速度,SAS硬盤傳輸數據可以達到3.0Gbit/sec。

            每個SAS電纜有4根電纜,2根輸入2根輸出。SAS可以同時進行數據的讀寫,全雙工的數據操作提高數據的吞吐效率。

            SAS的發展史

            2001年11月26日,Compaq、IBM、LSI邏輯、MaxtorSeagate聯合宣布成立SAS工作組。

            在2003年的CEBIT大會上,惠普希捷早已推出了SAS界面的硬盤樣品。當時,英特爾和Emulex也表示,將計劃開發支持SAS和SATA界面的處理器。去年11月,Adaptec也推出了SAS控制器出樣,新品的平均數據帶寬為3Gbps,峰值帶寬達5Gbps。

            未來,第二代和第三代的SAS界面將提供6-12Gbps的數據帶寬,并支持HostRAID。

            現在開發SAS架構的存儲設備企業包括希捷、前邁拓、LSI Logic和Adaptec等。

            SAS產品市場的發展趨勢

            在新一代以SAS為基礎的應用結構下,SAS與SATA企業用硬盤是彼此能夠截長補短非常理想的儲存組件。SAS硬盤是為需求量較大及具備關鍵性處理任務的應用裝置所設計的產品,而SATA硬盤則適合于近線儲存及其它對于儲存需求量較小的中小型企業所應用。

            預計今年,低端的存儲系統將由SATA取代SCSI硬盤,而高、中端的外部存儲系統將大部分采用光纖通道。但存儲系統價格的迅速下滑等因素卻讓業界對SAS硬盤的態度大幅改變。在產品價格快速下降的趨勢下,存儲設備廠商勢必通過更具有成本優勢的技術制造存儲設備,而SAS硬盤正是符合這種需求的產品。另外,SAS系統和SATA系統的兼容性,以及I-SCSI連接標準的實行,也都會推動SAS系統的發展。

            由于企業市場一向對新技術較為保守,也許SAS技術的普及不會像SATA技術那樣迅速,但是這也只是時間問題。前邁拓公司預計,到2009年將有三分之二的外部存儲設備采用SAS技術,以連接SAS或SATA硬盤。

            SAS硬盤應用

            存儲設備的反應速度,除了各環節間的配合與操作系統的影響之外,硬盤的反應速度其實具有關鍵性的地位。企業級的工作站或存儲設備,一般來說,都采用光纖信道(Fibre Channel,FC)與SCSI硬盤作為內部的存儲媒體。但是隨著SCSI硬盤在擴增性上的限制,SAS(Serial Attached SCSI)硬盤展露頭角。由于服務器廠商有越來越多采用SAS硬盤作為內部的存儲媒體,那么在存儲市場里,SAS硬盤是否會成為FC硬盤的勁敵?NetApp表示小型負載的應用可以采用SAS硬盤,可兼具預算與效能的考慮。

            既然SAS硬盤比較適合小型負載的應用,那么哪些應用為小型負載的狀況呢?NetApp解釋,例如在1,000人以下的電子郵件系統,或者規模不大的ERP、CRM系統,很多國內中小企業就相當適合。而像是大型的ERP、CRM系統,或是在線實時交易系統等,因為傳輸量大,反應速度需要實時快速,所以還是應當采用更高端的光纖信道硬盤。

           SAS適配器

            SAS適配器其實就類似于SCSI控制芯片,因為現在的主板上基本都沒有集成支持SAS的刂菩酒孕枰褂枚鍆獾睦┱箍ǎ屠嗨樸赟CSI控制卡這種概念。目前提供這種控制卡的主要是業界著名的LSI Logic和Adaptec。

            ★LSI Logic

            LSI最新的支持SAS接口的硬盤卡去年8月在東京也已經開始銷售,型號為SAS3442X,采用服務器主板常見的PCI-X接口,售價在5萬8590日元。此款產品僅提供了1個SAS硬盤接口,付送的數據線提供了4個擴展硬盤接口。

            LSI邏輯去年9月則宣布已開始向主要的OEM客戶供應LSI 3Gb/s串行 SCSI(SAS)28和36端口擴展器IC樣品,該新品--LSISASx28 和 LSISASx36進一步拓寬了LSI邏輯在IC、HBA、MegaRAID卡以及SAS ROMB解決方案等領域業界領先的SAS產品線,也更增強了其作為技術創新者的市場地位。

            主要的產品特性包括:用于網絡安全應用及啟動設備功能的基于物理層的分區(phy-based zoning for network security applications and initiator functionality),如自動檢測和自動配置(self-discovery and self-configuration)。該產品主要通過一個ARM處理器實現處理及擴展SAS功能。LSI邏輯目前正積極進行在客戶端的產品演示工作。

            LSISASx28 和 x36擴展器IC為內、外部 SEP提供了一個通用的可編程模塊,便于產品開發及客戶的無縫移植(seamless customer migration)。此外,還可以為客戶降低向后兼容LSISASx12 和LSISASx12A外部SEP接口的風險。這兩種高端口數擴展器每個端口都支持1.5和3Gb/s SATA和SAS的數據傳輸速率,并提供了一種靈活、可升級、高性能的解決方案。大量的測試已驗證了該SAS擴展器 IC 和LSI邏輯的其他SAS元器件產品完全的互操作性。

            LSI邏輯新的高端口數擴展器建立在業界最完善的SAS產品線基礎上,該產品線包括12端口擴展器、4和8端口PCI-X及PCI Express控制器IC,LSISAS1078 PCI Express到片上SAS RAID(RAID-on-Chip)解決方案、HBA、MegaRAID適配器卡以及ROMB解決方案。

            根據最新的報道,LSI邏輯(LSI Logic)公司已經于近日宣布出貨LSI 3Gb/s SAS(Serial Attached SCSI)36端口和28端口擴展器(expander)的量產單元。

            ★Adaptec

            Adaptec不是第一個在市場上推出SAS產品的廠商,不過,Adaptec一出手就不凡,發布了包括SAS HBA、RAID卡、內部存儲和外部子系統在內的最寬廣的SAS產品線。

            去年年底,Adaptec同時推出了4塊板卡、1款軟件和兩個外部存儲陣列。串行連接SCSI 48300卡具有8個3.0Gb/s SAS/SATA端口,用于提高多媒體和I/O密集型應用的性能,提供RAID 0、1和10數據保護;串行連接SCSI RAID 4800SAS和4805SAS控制器是高性能8端口SAS RAID卡,可通過PCI-X(4800SAS)或PCIe(4805SAS)主機接口安裝到服務器,并且都支持SAS或SATA硬盤,配置了128MB帶ECC保護的DDR2 DRAM和標準的RAID 0、1、10、5和50功能,控制器核心采用Adaptec RAID Code(ARC),提供增強型數據保護并簡化包括熱插拔、熱備、RAID類別轉換、在線容量擴展和優化磁盤利用在內的眾多RAID功能的維護;335SAS是高可靠、帶4個可熱插拔3.5英寸硬盤倉的內部存儲柜,可接入SAS和SATA硬盤,包括一個小巧的CD-ROM倉,具有理想的性能和可靠性,每個SAS或SATA Ⅱ RAID控制器卡可支持最多兩個存儲柜;SANbloc 5000f RAID子系統是FC-SAS外部存儲解決方案,適用于DAS或SAN,提供高性能輸入輸出,可安裝SAS硬盤作為高可靠的主存儲,或接入SATA硬盤提供經濟有效的存儲容量,也可以在同一系統中混接兩種硬盤,并可通過SANbloc S50 JBOD獲得容量擴充,支持SMI-S和Microsoft VDS等行業軟件標準;SANbloc S50 JBOD是高性能SAS-SAS JBOD產品,可用作DAS、基于主機的RAID陣列,或作為Adaptec SANbloc 5000f的擴展存儲,支持SAS或SATA硬盤。

            SAS硬盤

            在希捷收購邁拓之前,邁拓已經推出了自己的SAS硬盤,而且還計劃發布更高容量的產品,不過現在在SAS唱主角的也就只剩希捷了,而日立富士通則 只是推出了相關產品而無法大量供貨。

            ★希捷

            Seagate在04年推出過兩款SAS硬盤,分別是Cheetah 15k.4和Savvio 10k.1,采用SAS接口,可以提高硬盤的性能,包括更強的系統穩定性以及總體而言更低的系統維護管理的開銷。值得一提的是Savvio 10k.1是一款2.5英寸硬盤。

            去年年底,采用Serial Attached SCSI (SAS)接口介面,容量為37GB的希捷Cheetah 15K.4硬盤(型號:ST336754SS)終于上市,其電機轉速高達15000RPM,內建8MB數據緩存,平均搜尋時間為3.5毫秒,最低零售價為4萬1790日元(約合人民幣2900元)。

            目前市面上看到的SAS硬盤基本都是希捷的Savvio,Cheetah還不多見。

            ★前邁拓

            邁拓被收購之前推出過兩款很經典的Atlas 10K V和Atlas 15K II,這兩款硬盤還曾經獲獎,而業界第一款300GB的高容量SAS硬盤--Atlas 10K V也是邁拓的杰作。

            Atlas 15K II和 Atlas 10K V在型號上就已經標出了各自的硬盤轉數,分別是15000RPM和10000RPM,而兩款硬盤都采用了雙通道SAS接口,使企業存儲系統的可用性更高。

            ★日立

            去年下半年,日立公司最新的采用Serial Attached SCSI(SAS)和4Gb/s Fibre Channel(4GFC)接口的Ultrastar 15K147系列硬盤產品已經進入量產階段。

            日立的3.5英寸 Ultrastar 15K147硬盤提供了超高的性能,平均搜尋時間為3.3毫秒,平均潛伏周期2毫秒,馬達轉速15,000rpm,內置16MB容量的緩存,分別提供36GB,73GB,147GB三種不同容量版本。

            4GFC規格硬盤設計用于網絡,文件共享,工作組,科研和工程學環境等方面的數據存儲。半雙工模式下每個端口的接口數據傳輸率高達400MB/S,全雙工模式則可以達到800MB/S。高性能的4GFC接口全兼容之前的2Gb/s和1Gb/s規格硬件,并在保持原有設備的優勢性功能特性基礎上,提供高達2倍的數據傳輸性能。

            ★富士通

            富士通美國分公司在SAS Plugfest 2004大會上展出了他們的小型架構(SFF)硬盤新品

            去年3月,富士通正式發布了自己首款采用Serial Attached SCSI(SAS)規格的硬盤產品—MAV20xxRC,這也將是世界上第一款采用SAS規格的硬盤產品。該產品轉速為10000rpm,大小為2.5英寸,平均尋道時間為4ms、快取容量為8Mb、SAS傳送速度理論值達3Gbps,并且其工作時的耗電量僅為4.5W。首次推出的產品容量將為73Gb與36Gb兩種。

            總結

            作為一種新的存儲接口技術,SAS不僅在功能上可與Fibre Channel媲美,還具有兼容SATA的能力,因而被業界公認為取代并行SCSI的不二之選。據吳剛介紹,SAS的優勢主要體現在:靈活性,可以兼容SATA,為用戶節省投資;擴展性,一個SAS域最多可以直連16384個設備;性能卓越,點對點的架構使性能隨端口數量增加而提高;更合理的電纜設計,在高密度環境中提供更有效的散熱。衡量一種技術的優劣通常有4個基本指標,即性能、可靠性、可擴展性和成本。回顧串行磁盤技術的發展歷史,從光纖通道,到SATA,再到SAS,幾種技術各有所長。光纖通道最早出現的串行化存儲技術,可以滿足高性能、高可靠和高擴展性的存儲需要,但是價格居高不下;SATA硬盤成本倒是降下來了,但主要是用于近線存儲和非關鍵性應用,畢竟在性能等方面差強人意;SAS應該算是個全才,可以支持SAS和SATA磁盤,很方便地滿足不同性價比的存儲需求,是具有高性能、高可靠和高擴展性的解決方案。

          posted @ 2007-10-10 15:28 Picasso 閱讀(523) | 評論 (0)編輯 收藏

          Vmware wiki and SATA support on ESX

          百科全書的summary
          http://zh.wikipedia.org/wiki/VMware#VMware_ESX.E6.9C.8D.E5.8A.A1.E5.99.A8

          終于完成了vmware server 到 ESX 的porting, 不容易。

          還是要有探索精神,雖然手冊上寫ESX不適合裝在SATA硬盤上,但2950的SCSI controller還是很
          大家都想用SATA硬盤上ESX,這樣可以節省很大一部份資金,所以我建議大家能否把支持SATA硬盤的陣列卡型列出來,如果有圖更好,有資源的朋友進行一下測試,通過后,大家預定,或根椐該卡的圖去電腦城購買呀,我就打算等哪位兄弟例出兼容的卡,去電腦城找。大家覺的怎樣呀,大家一起動手,就不用花冤枉錢呀
          LSI MegaRaid SATA 150-4 / 150-6 Raid card

          Adaptec 2610SA RAID card

          Dell Cerc 1.5/6ch Raid

          Intel SRCS14L SATA Raid


          以上四種SATA Raid卡確認支持VMWare ESX Server ...
          咱們要先從沒到有,再從有到尋找到最便宜又實用的卡,這幾個卡,偶今天去查查看都要多少錢

          經查LSI MegaRaid SATA 150-4 / 150-6 Raid card   要3800左右
          Adaptec 2610SA RAID card      1500左右    6個SATA接口,raid 5 0 1支持  64位PCI接口,不能上普通PC PCI口,家用機沒希望 上 郁悶


          另外兩個末知,呵呵,看來這個adaptec是我們首選 了,如果有更便宜的我會繼續跟進。
          大家可以參考http://www.vmprofessional.com/index.php?content=sata_faq

          Confirmed Working
          Controller Driver vmware-devices.map lspci
          LSILogic MegaRAID 150-4 megaraid2 unknown unknown
          LSILogic MegaRAID 150-6 megaraid2 unknown unknown
          Dell Cerc 1.5/6ch aacraid-115 device,0x9005,0x0285,scsi,CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) RAID bus controller: Adaptec Adaptec SCSI (rev 01)
          Adaptec 2610SA aacraid-115 device,0x9005,0x0285,scsi,AAR-2610SA PCI SATA 6ch RAID bus controller: Adaptec Adaptec SCSI (rev 01)
          Intel SRCS14L gdth device,0x8086,0x0600,scsi,RAID Controller RAID bus controller: Intel Corporation RAID Controller


          Suspected to work Controller Driver vmware-devices.map lspci
          Adaptec 2410SA aacraid-115 device,0x9005,0x0285,scsi,AAR-2410SA PCI SATA 4ch (Jaguar II) RAID bus controller: Adaptec Adaptec SCSI (rev 01)
          HP P600 unknown unknown unknown


          Confirmed not Working Controller Driver vmware-devices.map lspci
          Intel SRCS28X unknown unknown unknown

          posted @ 2007-10-10 15:24 Picasso 閱讀(1061) | 評論 (0)編輯 收藏

          WPF——微軟的UI革命(轉)

          http://www.cnblogs.com/cuihongyu3503319/archive/2007/02/25/655660.html

          posted @ 2007-09-25 14:51 Picasso 閱讀(149) | 評論 (0)編輯 收藏

          http://www.cnblogs.com/tonyqus/archive/2006/11/30/577097.html

          posted @ 2007-09-25 14:40 Picasso 閱讀(169) | 評論 (0)編輯 收藏

          Tape information

          原來百科全書這種東西也總結了,收納
          http://en.wikipedia.org/wiki/Linear_Tape-Open

          posted @ 2007-09-05 17:33 Picasso 閱讀(186) | 評論 (0)編輯 收藏

          SSL的證書驗證

          SSL協議與數字證書原理 1樓

          SSL 協議的握手和通訊

            為了便于更好的認識和理解 SSL 協議,這里著重介紹 SSL 協議的握手協議。SSL 協議既用到了公鑰加密技術又用到了對稱加密技術,對稱加密技術雖然比公鑰加密技術的速度快,可是公鑰加密技術提供了更好的身份認證技術。SSL 的握手協議非常有效的讓客戶和服務器之間完成相互之間的身份認證,其主要過程如下:
            ① 客戶端的瀏覽器向服務器傳送客戶端 SSL 協議的版本號,加密算法的種類,產生的隨機數,以及其他服務器和客戶端之間通訊所需要的各種信息。
            ② 服務器向客戶端傳送 SSL 協議的版本號,加密算法的種類,隨機數以及其他相關信息,同時服務器還將向客戶端傳送自己的證書。
            ③ 客戶利用服務器傳過來的信息驗證服務器的合法性,服務器的合法性包括:證書是否過期,發行服務器證書的 CA 是否可靠,發行者證書的公鑰能否正確解開服務器證書的“發行者的數字簽名”,服務器證書上的域名是否和服務器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續進行第四步。
            ④ 用戶端隨機產生一個用于后面通訊的“對稱密碼”,然后用服務器的公鑰(服務器的公鑰從步驟②中的服務器的證書中獲得)對其加密,然后將加密后的“預主密碼”傳給服務器。
            ⑤ 如果服務器要求客戶的身份認證(在握手過程中為可選),用戶可以建立一個隨機數然后對其進行數據簽名,將這個含有簽名的隨機數和客戶自己的證書以及加密過的“預主密碼”一起傳給服務器。
            ⑥ 如果服務器要求客戶的身份認證,服務器必須檢驗客戶證書和簽名隨機數的合法性,具體的合法性驗證過程包括:客戶的證書使用日期是否有效,為客戶提供證書的 CA 是否可靠,發行 CA 的公鑰能否正確解開客戶證書的發行 CA 的數字簽名,檢查客戶的證書是否在證書廢止列表(CRL)中。檢驗如果沒有通過,通訊立刻中斷;如果驗證通過,服務器將用自己的私鑰解開加密的“預主密碼”,然后執行一系列步驟來產生主通訊密碼(客戶端也將通過同樣的方法產生相同的主通訊密碼)。
            ⑦ 服務器和客戶端用相同的主密碼即“通話密碼”,一個對稱密鑰用于 SSL 協議的安全數據通訊的加解密通訊。同時在 SSL 通訊過程中還要完成數據通訊的完整性,防止數據通訊中的任何變化。
            ⑧ 客戶端向服務器端發出信息,指明后面的數據通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知服務器客戶端的握手過程結束。
            ⑨ 服務器向客戶端發出信息,指明后面的數據通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知客戶端服務器端的握手過程結束。
            ⑩ SSL 的握手部分結束,SSL 安全通道的數據通訊開始,客戶和服務器開始使用相同的對稱密鑰進行數據通訊,同時進行通訊完整性的檢驗。


            雙向認證 SSL 協議的具體過程
             ① 瀏覽器發送一個連接請求給安全服務器。
            ② 服務器將自己的證書,以及同證書相關的信息發送給客戶瀏覽器。
            ③ 客戶瀏覽器檢查服務器送過來的證書是否是由自己信賴的 CA 中心所簽發的。如果是,就繼續執行協議;如果不是,客戶瀏覽器就給客戶一個警告消息:警告客戶這個證書不是可以信賴的,詢問客戶是否需要繼續。
             ④ 接著客戶瀏覽器比較證書里的消息,例如域名和公鑰,與服務器剛剛發送的相關消息是否一致,如果是一致的,客戶瀏覽器認可這個服務器的合法身份。
             ⑤ 服務器要求客戶發送客戶自己的證書。收到后,服務器驗證客戶的證書,如果沒有通過驗證,拒絕連接;如果通過驗證,服務器獲得用戶的公鑰。
             ⑥ 客戶瀏覽器告訴服務器自己所能夠支持的通訊對稱密碼方案。
             ⑦ 服務器從客戶發送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密后通知瀏覽器。
             ⑧ 瀏覽器針對這個密碼方案,選擇一個通話密鑰,接著用服務器的公鑰加過密后發送給服務器。
             ⑨ 服務器接收到瀏覽器送過來的消息,用自己的私鑰解密,獲得通話密鑰。
             ⑩ 服務器、瀏覽器接下來的通訊都是用對稱密碼方案,對稱密鑰是加過密的。
             上面所述的是雙向認證 SSL 協議的具體通訊過程,這種情況要求服務器和用戶雙方都有證書。單向認證 SSL 協議不需要客戶擁有 CA 證書,具體的過程相對于上面的步驟,只需將服務器端驗證客戶證書的過程去掉,以及在協商對稱密碼方案,對稱通話密鑰時,服務器發送給客戶的是沒有加過密的(這并不影響 SSL 過程的安全性)密碼方案。 這樣,雙方具體的通訊內容,就是加過密的數據,如果有第三方攻擊,獲得的只是加密的數據,第三方要獲得有用的信息,就需要對加密的數據進行解密,這時候的安全就依賴于密碼方案的安全。而幸運的是,目前所用的密碼方案,只要通訊密鑰長度足夠的長,就足夠的安全。這也是我們強調要求使用 128 位加密通訊的原因。



          證 書 各 部 分 的 含 義
          Version 證書版本號,不同版本的證書格式不同
          Serial Number 序列號,同一身份驗證機構簽發的證書序列號唯一
          Algorithm Identifier 簽名算法,包括必要的參數 Issuer 身份驗證機構的標識信息
          Period of Validity 有效期
          Subject 證書持有人的標識信息
          Subject’s Public Key 證書持有人的公鑰
          Signature 身份驗證機構對證書的簽名


            證書的格式  認證中心所發放的證書均遵循 X.509 V3 標準,其基本格式如下:

          證書版本號(Certificate Format Version) 含義:用來指定證書格式采用的 X.509 版本號。
          證書序列號(Certificate Serial Number) 含義:用來指定證書的唯一序列號,以標識 CA 發出的所有公鑰證書。
          簽名(Signature) 算法標識(Algorithm Identifier) 含義:用來指定 CA 簽發證書所用的簽名算法。
          簽發此證書的 CA 名稱(Issuer ) 含義:用來指定簽發證書的 CA 的 X.500 唯一名稱(DN, Distinguished Name)。
          證書有效期(Validity Period) 起始日期(notBefore) 終止日期(notAfter) 含義:用來指定證書起始日期和終止日期。
          用戶名稱(Subject) 含義:用來指定證書用戶的 X.500 唯一名稱(DN,Distinguished Name)。
          用戶公鑰信息(Subject Public Key Information) 算法(algorithm) 算法標識(Algorithm Identifier) 用戶公鑰(subject Public Key) 含義:用來標識公鑰使用的算法,并包含公鑰本身。
          證書擴充部分(擴展域)(Extensions) 含義:用來指定額外信息。 
          X.509 V3 證書的擴充部分(擴展域)及實現方法如下: CA 的公鑰標識(Authority Key Identifier) 公鑰標識(SET 未使用)(Key Identifier) 簽發證書者證書的簽發者的甄別名(Certificate Issuer) 簽發證書者證書的序列號(Certificate Serial Number)

           X.509 V3 證書的擴充部分(擴展域)及實現CA 的公鑰標識(Authority Key Identifier) 公鑰標識(SET 未使用)(Key Identifier) 簽發證書者證書的簽發者的甄別名(Certificat簽發證書者證書的序列號(Certificate Serial N含義:CA 簽名證書所用的密鑰對的唯一標識用戶的公鑰標識(Subject Key Identifier) 含義:用來標識與證書中公鑰相關的特定密鑰進行解密。 證書中的公鑰用途(Key Usage) 含義:用來指定公鑰用途。
          用戶的私鑰有效期(Private Key Usage Period) 起始日期(Note Before) 終止日期(Note After) 含義:用來指定用戶簽名私鑰的起始日期和終止日期。 CA 承認的證書政策列表(Certificate Policies) 含義:用來指定用戶證書所適用的政策,證書政策可由對象標識符表示。 用戶的代用名(Substitutional Name) 含義:用來指定用戶的代用名。 CA 的代用名(Issuer Alt Name) 含義:用來指定 CA 的代用名。 基本制約(Basic Constraints) 含義:用來表明證書用戶是最終用戶還是 CA。 在 SET 系統中有一些私有擴充部分(擴展域)Hashed Root Key 含義:只在根證書中使用,用于證書更新時進行回溯。 證書類型(Certificate Type) 含義:用來區別不同的實體。該項是必選的。 商戶數據(Merchant Data) 含義:包含支付網關需要的所有商戶信息。 持卡人證書需求(Card Cert Required) 含義:顯示支付網關是否支持與沒有證書的持卡人進行交易。 SET 擴展(SETExtensions) 含義:列出支付網關支持的支付命令的 SET 信息擴展。 CRL 數據定義版本(Version) 含義:顯示 CRL 的版本號。
          CRL 的簽發者(Issuer) 含義:指明簽發 CRL 的 CA 的甄別名。 CRL 發布時間(this Update) 預計下一個 CRL 更新時間(Next Update) 撤銷證書信息目錄(Revoked Certificates) CRL 擴展(CRL Extension) CA 的公鑰標識(Authority Key Identifier) CRL 號(CRL Number)

          posted @ 2007-09-04 18:05 Picasso 閱讀(3713) | 評論 (0)編輯 收藏

          BQ中的DST 處理

          最近BQ關于時間處理出問題, 是因為時間的計算上沒有處理好DST,以前做計費的時候老碰到,還做了專題,疏忽了,微軟倒有詳細的解釋,抄錄如下:
          http://support.microsoft.com/kb/932955/zh-cn

          posted @ 2007-09-04 14:50 Picasso 閱讀(204) | 評論 (0)編輯 收藏

          有志之人立志常,無志之人常立志

          偶爾聽到的

          posted @ 2007-08-30 20:27 Picasso 閱讀(160) | 評論 (0)編輯 收藏

          WPF automation

          產品的GUI Automation準備:
          1.書籍:
          http://www.cnblogs.com/tonyqus/archive/2007/08/01/835071.html

          這本書是由Adam Nathan和Daniel Lehenbauer寫的,這兩個人都是WPF Team的,而且都是核心開發工程師,技術級別自然是很高的。全書共有600頁左右,原版書采用全彩印刷,于2007年初由SAMS出版社出版發行。作為一本Unleashed級別的書,自然要適合初、中、高各個層次的開發者。

          本書共分為6個部分,其實嚴格意義上講是5部分,因為第6部分是附錄。讓我們看看這五部分分別講了什么:
          第一部分 背景

          這部分主要講WPF的由來、為什么要使用WPF,以及一些WPF的基礎知識。總的來說,這一部分是為接下來的幾個部分作鋪墊的,可以算是打基礎。對于初學者來說,看完這一部分你就可以基本了解WPF是什么、為什么要學習WPF以及WPF的發展方向,說白了就是讓你找到學習的方向。我個人對于這種寫作風格十分喜歡,一開始就告訴你這個技術的用途,而且用了大篇幅來講一些實際的例子,讓讀者可以有一個感性的認識。

          第二部分 構建一個WPF應用程序

          顧名思義,這部分講的是構建一個WPF應用程序所需要的知識。但這一部分要比上一部分中的基礎知識深入多了,講的都是很實用的東西,直接可以在開發中使用,比如控件、變換等,當然這一部分主要還是著重于打基礎,但與你所想象的不同,它并不是一步一步教你構建一個類似于Hello World的程序,而是把涉及的一些概念講得比較深入,作者似乎是想讓讀者在充分理解的基礎上創建第一個WPF應用程序。

          第三部分為專業開發人員設計的功能

          這部分算是第二部分的提高篇,講到了資源、數據綁定、樣式、模板等,這些可都是做高端開發所必須的,但由于是一些相對較難理解的東西,所以作者把它放在這部分里一切講解。

          第四部分 富媒體使你的程序領先于時代

          這部分圍繞著富媒體展開,這也是WPF真正牛的地方,比如說2D和3D功能、動畫、視頻、音頻等,WPF的最大優點就在于它把使用這些富媒體的門檻降低了,所以如果你想真正開發出科幻般的應用程序的話,這一部分自然是必須看的。

          第五部分 高級主題

          這部分相對于前幾部分有相當的難度,所以才叫高級主題!我個人覺得這一章完全是為高級開發人員準備的,其中涉及的內容都是關于定制控件開發、互操作性之類的,要看這一章你必須對前面的部分有充分的理解。

          這本書的寫作風格也很有特點,其中有大量的提示、警告和深入挖掘。所謂提示,就是一些技巧性的東西,根據正文講的東西展開;所謂警告,則是告訴我們哪些東西可以用,哪些不可以用,這一技術有什么技巧;所謂深入挖掘,就是對正文所提到的東西深入講解一番,可以有效幫助我們加深對一些知識點的理解。

          大家可以去http://adamnathan.net/wpf/ 下載這本書的代碼,不過貌似沒有找到勘誤信息,可能作者對這本書的質量比較有自信吧。

          這幾年軟件開發的重點在Web,但Charles Petzold依然固守在Client端的GUI程序設計,我原本以為,他會漸漸沒落,事實上,《Programming Microsoft Windows with C#》的銷售也不能算很好。但是隨著WPF技術的出現,Charles Petzold的這本《Applications = Code + Markup》將會讓他再度成為重要的書籍作者。

          這是一本「學習用書」而非「參考用書」。盡管如此,本書的讀者必須熟悉C#語言并具備.NET Framework的經驗,沒有經驗的讀者,可以閱讀Charles Petzold寫的在線免費書籍《.NET Book Zero: What the C or C++ Programmer Needs to Know about C# and the .NET Framework》。

          Applications = Code + Markup》介紹如何使用WPF編寫微軟Windows平臺的程序。WPF的程序可以是一般的獨立Windows應用(這樣的程序現在常稱為 Client應用),或者是分布式(Distributed)應用的前端(也就是RIARich Internet Application),未來也可能利用WPF/E取代一部分的Web技術,例如:ASP.NETWPF被認為是Windows Vista的主要API,但是也可以用在已安裝.NET 3.0Windows XP/SP2Windows Server 2003

          WPF
          其實包含「兩個」互相關連的程序設計接口。你可以利用C#(或其它.NET語言)編寫WPF程序。WPF也具備一個讓人興奮的XML語言, 稱為XAML,甚至可以只用XAML開發某些應用。但是一般來說,你會同時利用程序代碼(Code)和標記(Makeup)一同開發出你的應用。現在,你應 該能夠體會,為什么這本書的書名為《Application = Code + Markup》。在WPF的觀念中,我們使用XAMLMarkup)定義使用者接口視覺的部分(包括圖形和動畫),然后寫程序代碼(Code)處理使用者 的輸入。

          WPF
          支持兩種非常不同的程序設計接口,每個程序設計員都應該要對于WPFCode部分建立穩固的根基,寫起Markup的時候才不會遇到障 礙。因此,本書分成兩個部分,各約半本書。第一部分先引導讀者如何利用C#寫出整個WPF程序(完全不用到XAML),第二部分再介紹XAML
          二部分將焦點轉移到XAML。展示如何只用XAML建立小型的應用,以及如何結合XAMLC#以建立更大型、更復雜的應用。因為XAML 是用來建立應用的視覺部分,所以本書大部分和圖形相關的內容,會放在第二部分。XAML的檔案大多數是用工具所產生出來的。然而,我們還是有必要具備「親自動手編寫XAML」的能力,本書試圖要教我們這么做。

          再過幾年Windows Forms也會被淘汰,而WPF才是未來的主流。雖然WPF尚未像Windows Forms提供這么多控件和標準對話框,但是未來卻很有發展潛力。特別是,如果你需要做很多客制化控件和繪圖,WPF會是你需要的。如果你想好好地學 習WPFCharles Petzold寫的這本《Applications = Code + Markup》,不會讓你失望的。
          2. WPF->net Framework里的UIAutomation 需要了解.
          http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1634518&SiteID=1
          http://msdn.microsoft.com/msdnmag/issues/07/03/Bugslayer/
          http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=769221&SiteID=1







          posted @ 2007-08-08 15:48 Picasso 閱讀(674) | 評論 (0)編輯 收藏

          批處理控制VMWare虛擬機


          http://myblog.iweb.net.cn/read.php?66
          VMWare 確實是好東西,不過安裝之后會增加四個自動啟動的服務以及兩個虛擬的網絡連接。我是比較討厭這種沒事就占著系統資源的東西,何況也不是經常要用著 VMWare ,所以寫了個批處理腳本來自動啟動/關閉 VMWare 虛擬機以及相關的服務和網絡連接。
          完整批處理文件內容如下:


          1 @echo On  
          2 @PROMPT [VMWareController]#  
          3  
          4 @if "%1" == "" goto Help  
          5 @if "%1" == "help" goto Help  
          6 @if "%1" == "/?" goto Help  
          7  
          8 @SET oprType=%1  
          9 @SET netOpr=%oprType%  
          10  
          11 @if "%oprType%" == "start" @SET netOpr=enable  
          12 @if "%oprType%" == "stop" @SET netOpr=disable  
          13  
          14 @SET vmxFile=%2  
          15 @Rem 如果沒有提供第二個參數vmx full path,將嘗試使用這里設定的缺省虛擬機  
          16 @Rem 根據需要把這個文件修改為實際希望啟動的vmx文件  
          17 @if "%vmxFile%" == "" @SET vmxFile=D:\VMWare\Red Hat Enterprise Linux 3.vmx  
          18  
          19 @Rem VMWare的安裝目錄,根據需要進行修改  
          20 @SET vmwareFolder=E:\AppTool\VMWare  
          21  
          22 @Rem 把VMWare相關的四個服務設置為手動  
          23 sc config VMAuthdService start= demand  
          24 sc config VMnetDHCP start= demand  
          25 sc config "VMware NAT Service" start= demand  
          26 sc config vmount2 start= demand  
          27  
          28 @Rem 啟動/停止VMWare相關的四個服務  
          29 net %oprType% "VMware Authorization Service"  
          30 net %oprType% "VMware DHCP Service"  
          31 net %oprType% "VMware NAT Service"  
          32 net %oprType% "VMware Virtual Mount Manager Extended"  
          33  
          34 @Rem 這里使用通配符來停用/啟用所有vmnet相關的網絡連接  
          35 devcon %netOpr% *vmnet*  
          36  
          37 @Rem 使用vmrun來運行指定的虛擬機  
          38 "%vmwareFolder%\vmrun" %oprType% "%vmxFile%"    
          39  
          40 @goto EndMission  
          41  
          42 :Help  
          43 @echo 自動啟動/停止指定的 VMWare 虛擬機以及相關的服務和網絡連接  
          44 @echo 需要 devcon 工具來控制網絡連接。工具下載地址:  
          45 @echo http://support.microsoft.com/kb/311272/zh-cn  
          46 @echo 命令行參數:  
          47 @echo %0 [start^|stop] ^  
          48 @echo ^為缺省啟動的虛擬機配置文件  
          49 @pause  
          50 goto EndMission  
          51  
          52 :EndMission  
          view plain | print | copy to clipboard | ?
          @echo On
          @PROMPT [VMWareController]#

          @if "%1" == "" goto Help
          @if "%1" == "help" goto Help
          @if "%1" == "/?" goto Help

          @SET oprType=%1
          @SET netOpr=%oprType%

          @if "%oprType%" == "start" @SET netOpr=enable
          @if "%oprType%" == "stop" @SET netOpr=disable

          @SET vmxFile=%2
          @Rem 如果沒有提供第二個參數vmx full path,將嘗試使用這里設定的缺省虛擬機
          @Rem 根據需要把這個文件修改為實際希望啟動的vmx文件
          @if "%vmxFile%" == "" @SET vmxFile=D:\VMWare\Red Hat Enterprise Linux 3.vmx

          @Rem VMWare的安裝目錄,根據需要進行修改
          @SET vmwareFolder=E:\AppTool\VMWare

          @Rem 把VMWare相關的四個服務設置為手動
          sc config VMAuthdService start= demand
          sc config VMnetDHCP start= demand
          sc config "VMware NAT Service" start= demand
          sc config vmount2 start= demand

          @Rem 啟動/停止VMWare相關的四個服務
          net %oprType% "VMware Authorization Service"
          net %oprType% "VMware DHCP Service"
          net %oprType% "VMware NAT Service"
          net %oprType% "VMware Virtual Mount Manager Extended"

          @Rem 這里使用通配符來停用/啟用所有vmnet相關的網絡連接
          devcon %netOpr% *vmnet*

          @Rem 使用vmrun來運行指定的虛擬機
          "%vmwareFolder%\vmrun" %oprType% "%vmxFile%"

          @goto EndMission

          :Help
          @echo 自動啟動/停止指定的 VMWare 虛擬機以及相關的服務和網絡連接
          @echo 需要 devcon 工具來控制網絡連接。工具下載地址:
          @echo http://support.microsoft.com/kb/311272/zh-cn
          @echo 命令行參數:
          @echo %0 [start^|stop] ^
          @echo ^為缺省啟動的虛擬機配置文件
          @pause
          goto EndMission

          :EndMission


            把以上代碼保存為 .bat 文件,并創建兩個指向該 .bat 文件的快捷方式,并分別給兩個快捷方式加上 start / stop 參數(也可以再提供第二個參數來指定啟動特定的虛擬機配置文件),就可以通過快捷方式直接啟動/停止 VMWare 相關的虛擬機和服務。

            其中使用了 devcon 工具來控制網絡連接的停用/啟用,需要到微軟網站下載該工具。

            注意:如果你的系統中存在其他硬件ID包含 *vmnet* 字符串的話會把所有相關的設備同時都禁用/啟用。你可以在命令行下輸入 devcon find *vmnet* 先檢查一下是否只匹配到 VMWare 所添加的兩個虛擬網絡連接。

            用 vmrun 關閉虛擬機的時候作用等同于在操作界面的 Power Off 按鈕。所以最好在執行批處理之前使用虛擬操作系統的 shutdown 命令先安全退出操作系統。

          posted @ 2007-08-01 06:59 Picasso 閱讀(1414) | 評論 (0)編輯 收藏

          SOAP協議初級指南

          http://www.yesky.com/229/1739729_8.shtml
          http://www0.ccidnet.com/tech/app/2001/09/21/58_3322.html
          http://www0.ccidnet.com/tech/app/2001/09/21/58_3321.html
          http://www0.ccidnet.com/tech/app/2001/09/21/58_3320.html
          http://www0.ccidnet.com/tech/app/2001/09/21/58_3319.html

          posted @ 2007-07-26 11:47 Picasso 閱讀(201) | 評論 (0)編輯 收藏

          XML NameSpace

          http://zhangjunhd.blog.51cto.com/113473/18934

          posted @ 2007-07-26 11:14 Picasso 閱讀(205) | 評論 (0)編輯 收藏

          Single Sign on 2

          Java based:
          http://www.ibm.com/developerworks/cn/websphere/library/techarticles/xiaojing/SSOprepare/SSOprepare.html


          MS based:
          http://www.microsoft.com/china/community/MsSpecialist/1.mspx

          posted @ 2007-07-25 18:50 Picasso 閱讀(171) | 評論 (0)編輯 收藏

          單點登陸 single sign-on

              只有注冊用戶登錄后才能閱讀該文。閱讀全文

          posted @ 2007-07-25 18:44 Picasso 閱讀(67) | 評論 (0)編輯 收藏

          ADO and ADO.net

          ADO是什么,它是如何操作數據庫的?

            答:ADO的全名是ActiveX Data Object(ActiveX數據對象),是一組優化的訪問數據庫的專用對象集,它為ASP提供了完整的站點數據庫解決方案,它作用在服務器端,提供含有數據庫信息的主頁內容,通過執行SQL命令,讓用戶在瀏覽器畫面中輸入,更新和刪除站點數據庫的信息。

            ADO主要包括Connection,Recordset和Command三個對象, 它們的主要功能如下:

            ·Connection對象:負責打開或連接數據庫文件;
            ·Recordset對象:存取數據庫的內容;
            ·Command對象:對數據庫下達行動查詢指令,以及執行SQL Server的存儲過程。

          使用Recordset對象和Command對象來訪問數據庫的區別在哪里?

            答:Recordset對象會要求數據庫傳送所有的數據,那么數據量很大的時候就會造成網絡的阻塞和數據庫服務器的負荷過重,因此整體的執行效率會降低。
          利用Command對象直接調用SQL語句,所執行的操作是在數據庫服務器中進行的,顯然會有很高的執行效率。特別是在服務器端執行創建完成的存儲過程,可以降低網絡流量,另外,由于事先進行了語法分析,可以提高整體的執行效率。


          什么是ADO.NET架構

          如今大部分的應用程序都需要后臺的數據庫來為其提供大量的數據來源,而應用程序與數據庫之間的交流稱為數據訪問。而ASP.NET則使用ADO.NETActive X Data Object)作為數據的訪問與操作的協議,從而使得我們可以在Internet上操作這些數據。

          ADO.NET的數據訪問分為兩大部分:數據集(DataSet)與數據提供源(Data Provider,我并不清楚中文該怎么翻譯,就叫它數據提供源好了,不要和“數據源”—Data Source搞混)

           

          數據集:

          數據集是一個非在線,完全由內存表示的一系列數據,可以被看作一份本地磁盤數據庫中部分數據的拷貝。數據集完全駐留內存,可以被獨立于數據庫地訪問或者修改。當數據集的修改完成后,更改可以被再次寫入數據庫,從而保留我們所做過的更改。數據集中的數據可以由任何數據源(Data Source)提供,比如SQL Server或者Oracle

           

          數據提供源:

          數據提供源用于提供并維護應用程序與數據庫之間的連接。

          數據提供源是一系列為了提供更有效率的訪問而協同工作的組件。如今微軟在ADO.NET中提供了兩組數據提供源,一組叫做SQL Data ProviderSQL數據提供源),用于提供應用程序與SQL Server 7.0或者更高版本的訪問。另一組叫做OleDb DataProviderObject Linking and Embedding DataBase DataProvider),可以允許我們訪問例如Oracle 之類的第三方數據源。

          每組數據提供源中都包含了如下四個對象:

          Connect對象提供了對數據庫的連接。

          Command對象可以用來執行命令。

          DataReader對象提供了只讀的數據記錄集。

          DataAdapter對象提供了對數據集更新或者修改的操作。

           

          總體來說,使用ADO.NET訪問數據可以被概括為以下步驟:

          首先應用程序創建一個Connect對象用來建立與數據庫之間的連接。然后Command對象提供了執行命令的接口,可以對數據庫執行相應的命令。當命令執行后數據庫返回了大于零個數據時,DataReader會被返回從而提供對返回的結果集的數據訪問。或者,DataAdapter可以被用來填充數據集,然后數據庫可以由Command對象或者DataAdapter對象進行相應的更改。

          具體來看數據提供源的四種對象

           

          Connect 對象

          Connect對象用來提供對數據庫的連接,Microsoft Visual Studio .Net中微軟提供了兩種Connect對象,分別為SqlConnection對象,用來提供對SQL Server 7.0或更高版本的連接,同時還有OleDbConnection對象,用來提供對Access與其他第三方數據庫的連接。

           

          Command 對象

          同樣,Command對象分為兩組,SqlCommandOleDbCommandCommand對象被用來執行針對數據庫的命令,比如執行數據庫的存儲過程(Stored Procedure)SQL命令,或者直接返回一個完整的表。Command對象提供三種方法(Methods)用來執行上述操作。

          ExecuteNonQuery用來執行一個不需返回數據的命令,比如表的插入,更新或者刪除操作。

          ExecuteScalar返回從一個查詢得到的單獨的值。

          ExecuteReader用來返回一個從DataReader來的結果集。

           

          DataReader對象

          DataReader提供了forward-only, read-only, connected stream的結果集。

          這里的forward-only表示數據只能夠向前,如果我們訪問了一條數據后想要再次訪問這條數據就必須重新開始。

          Read-only表示只讀,不能夠對結果集進行操作。

          Connected stream表示DataReader對象是面向流連接的。所謂的流可以把它看作是管道,這邊放進去東西那邊就可以得到,實際上TCP協議就是面向連接的流協議。

          不同于其他的三種對象,DataReader不能夠被用戶直接創建,必須也只能由ExecuteReader返回。

          SqlCommand.ExecuteReader返回SqlDataReader

          同理,OleDbCommand.ExecuteReader返回OleDbDataReader

          需要注意的是,DataReader對應用程序提供行級訪問(每次只能訪問數據的一行),當你需要多行的時候就需要多次的訪問這個對象。這樣做的好處就是內存中永遠只需要保留一行的數據,缺點就是每次訪問都要開啟Connect的連接。

           

          DataAdapter對象

          DataAdapter對象是ADO.NET數據訪問的核心。實際上它是數據集與數據庫的中間層。DataAdapter可以使用Fill方法來為DataTable或者DataSet填充數據。然后當內存操作完成后DataAdapter可以確認之前的操作從而對真正存于數據庫上的數據進行修改。

          DataAdapter包含四種屬性用來代表不同的數據庫命令:

          SelectCommand用來查詢數據

          InsertCommand用來插入數據

          DeleteCommand用來刪除數據

          UpdateCommand用來更新數據Update方法被調用后,數據集中的數據被更改然后拷貝回數據庫,緊接著使用InsertCommand, DeleteCommand, UpdateCommand中合適一個來進行數據更新。

          posted @ 2007-07-25 16:46 Picasso 閱讀(270) | 評論 (0)編輯 收藏

          DOM簡介

                   <name>Winter Blanket (78 inch)</name>
                   <price>20</price>
                   <qty>10</qty>
                </item>
             </order>
          </orders>
              在 DOM 中,使用 XML 信息意味著首先將它劃分為節點。

          posted @ 2007-07-25 16:34 Picasso 閱讀(258) | 評論 (0)編輯 收藏

          COM與.NET的交互

           
           Advanced COM Interop


          .NET framework 是從COM的一種自然地進步,因為這兩個模型共享了許多中心的主題,包括組件重用和語言中立。為了支持向后兼容,COM interop提供了不需要修改現有組件而能訪問現有COM組件的方法。可以通過使用COM interop工具導入相關的COM類型來合并COM組件到.NET Framework的應用中。一旦導入,COM的類型就可以使用了。

          COM interop 同時也提供了向前兼容使得COM的客戶可以像訪問其他的COM對象一樣訪問托管的代碼,COM interop又一次的提供了所謂的無縫從程序集中導出元數據(metadata)到類型庫并且像傳統COM組件一樣注冊托管組件的方法。無論是導出還是導入工具處理的結果都與COM規范一致。在運行時,如果需要的話common language runtime在COM對象和托管代碼之間列集(marshals)數據


          1. COM Wrappers
          COM在以下幾個方面與.NET Framework的對象模型有所不同:
          • COM對象的客戶程序必須管理這些對象的生命期;在.NET Framework 中CLR管理這些對象的生命期
          • COM的客戶通過請求一個接口并得到接口的指針來查詢一個服務是否有效,.NET的客戶可以通過反射(reflection)來得到一個對象的功能的描述
          • .NET的對象駐留在.NET Framework執行環境管理的內存中,執行環境可以因為性能的原因刪除內存中的對象并且更新它刪除的對象的所有引用。非托管的客戶,得到一個對象的指針,依賴于對象保留在相同的位置。這種客戶沒有那種處理在內存中不在固定位置的對象的機制。


          為了克服這些不同,runtime提供了包裝類使得托管代碼和非托管代碼的客戶都認為他們在自己的環境中調用對象的方法。當托管客戶調用一個COM對象的方法時,runtime創建一個runtime callable wrapper (RCW)。RCWs抽象了托管代碼和非托管代碼引用機制的不同。Runtime還創建了一個COM callable wrapper (CCW)來實現其逆過程,使得COM的客戶能夠無縫的調用.NET對象的方法。如下圖所示


          COM wrapper overview



          在大多數情況下,標準的RCW或者CCW由runtime生成,為跨越COM和.NET Framework的邊界調用提供了足夠的列集。使用自定義的屬性,可以隨意的調整runtime表示托管代碼和非托管代碼的方式

          Runtime Callable Wrapper


          CLR(common language runtime)通過一個叫做runtime callable wrapper (RCW)的代理(proxy)暴露COM 對象. 雖然RCW對于.NET的客戶似乎是一個普通的.NET對象,但是它的主要功能卻是在.NET客戶和COM對象之間列集調用。


          運行時正確的為每個COM對象創建一個RCW,而不管那個對象上存在的引用的個數。如下圖所示:任意數量的托管客戶可以保持一個暴露INew 和INewer 接口的COM對象的引用。運行時為每個COM對象維護一個單獨的RCW。


          Accessing COM objects through the runtime callable wrapper



          使用來源于類型庫(type library)的元數據(metadata),運行庫(runtime)創建將被調用COM對象和這個對象的包裝(wrapper)。每個RCW維護它所包裝的COM對象的接口指針并且在RCW不再需要時釋放COM對象。運行庫(runtime)在RCW之上作垃圾收集。


          在其他的活動中,RCW代表所包裝的對象在托管和非托管代碼之間列集(marshals)數據。特別的是,RCW在客戶和服務有不同的數據表現形式,并需要在他們之間傳遞數據時,提供方法參數和方法返回值得列集。


          標準的wrapper執行內置(built-in)的列集規則。例如:當.NET的客戶傳遞一個String類型作為參數的一部分給托管對象的時候,wrapper把string類型那個轉化為BSTR類型。當COM對象返回一個BSTR給托管的調用著的時候,調用著收到一個string。無論是客戶還是服務端接受和發送數據都使用自己熟悉的類型。還有一些其他的類型不需要變化,例如:一個標準的wrapper將在托管和非托管代碼之間一直傳遞4-byte integer而不做任何變化。


          RCW的主要目標就是隱藏托管代碼模型和非托管代碼模型之間的差別,實現無縫的傳輸。RCW使用選擇的接口而不把它們暴露給.NET的客戶端,如下圖所示


          COM interfaces and the runtime callable wrapper



          當創建一個早期的COM對象的時候,RCW是一個特殊的類型。它實現了COM對象實現的一些接口并且暴露它們的方法,屬性和時間。如圖所示:RCW暴露了INew接口,但是使用了IUnknown 和IDispatch接口。RCW向.NET客戶暴露了INew的所有成員


          COM Callable Wrapper


          當COM的客戶調用.NET的對象時,CLR創建這個托管的對象和這個托管的對象COM callable wrapper(CCW),COM客戶可以使用CCW作為托管對象的一個代理,而不能夠直接使用.NET的對象。

           
          Runtime正確的創建托管對象的CCW,不管要求這個服務的COM客戶的數量。如下圖所示,多個COM客戶可以保持包含INew 接口的CCW的引用,CCW,反過來包含一個實現了接口和垃圾收集的托管對象的單獨的引用。COM和.NET的客戶可以同時在相同的托管對象是發起調用。


          Accessing .NET objects through COM callable wrapper


          COM callable wrappers對于運行在.NET Framework上的其他類是不可見的。它們的主要目的是在托管和非托管代碼之間列集(marshal)調用,而且CCWs同時也管理著它所包含對象的identity和對象的生存期(lifetime)


          Object Identity
          運行時(runtime)在它的能夠垃圾回收的堆里(garbage-collected heap)為.NET對象分配內存,這能使runtime需要的時候在內存中移動對象。相反,runtime在不能進行垃圾收集的堆上為CCW分配內存,使COM客戶能夠直接引用它。


          Object Lifetime
          與它所包含的.NET 對象不同,CCW是一個基于引用計數的傳統的COM。當CCW的引用計數減少到0,wrapper釋放自己在托管對象上的引用。沒有引用的托管的對象在下一次垃圾收集的周期內將被收集。


          Customizing Standard Wrappers
          這部分將描述如何自定義標準的runtime callable wrappers(RCW) and COM callable wrappers.(CCW)


          ? Runtime Callable Wrappers
          當.NET激活一個COM對象時,運行時(runtime)生成一個包含COM類型的runtime callable wrapper (RCW),如下圖所示, 運行時(runtime)使用從導入的類型庫而得到的元數據(metadata)來生成RCW。Wrapper根據interop marshaling service定義的規則列集數據。


          RCW generation and method calls




          有兩個方式可以自定義RCW。如果你可以修改Interface Definition Language (IDL)的源文件,你可以給type library file (TLB) 添加屬性然后導入TLB。還可以應用interop-specific attributes來導入類型生成新的程序集(assembly)支持自定義的標準RCWs被這些attributes限制


          To modify the IDL source

          1. Apply TLB attributes to libraries, types, members, and parameters. Use the custom keyword and an attribute value to change metadata. By applying TLB attributes, you can:
          • Specify the managed name of an imported COM type, instead of allowing the import utility to select the name according to standard conversion rules.
          • Explicitly define a destination namespace for the types in a COM library.
          2. Compile the IDL source code.
          3. Generate an assembly from the resulting type library file or from a dynamic link library file (DLL) that contains the type you intend to implement.


          To modify an imported assembly
          1. Import the type library file. Use the Type Library Importer (Tlbimp.exe) to generate an assembly DLL.
          2. Create a text file from the imported assembly by using the MSIL Disassembler (Ildasm.exe).
          3. Apply interop attributes to the text file.
          4. Generate a new assembly from the modified text file by using the MSIL Assembler (Ilasm.exe).


          ? COM Callable Wrappers
          COM callable wrapper (CCW) 向COM導出NET Framework對象. 通過把一個托管的工程編譯成一個DLL的程序集, 可以自動的創建需要的元數據來描述程序集中的類型. 當一個COM的客戶激活托管對象時,運行時使用元數據來生成CCW.
          自定義CCW,你的托管的代碼要遵循交互規范屬性(interop-specific attributes),并且把編譯代碼編譯成程序集,如下圖所示,在這個例子中,Tlbexp.exe把托管類型編譯為COM


          CCW 的生成和方法調用



          通過在代碼中添加屬性,可以在交互列集服務限定的范圍內改變接口和數據的列集行為。例如,可以你可以控制方法參數傳遞的格式,也可以控制程序集中的什么類型暴露給COM


          2 .托管和非托管的線程(Managed and Unmanaged Threading)


          COM組件使用套間(apartments)來同步資源的訪問。與之對應的是,托管對象使用同步區域(synchronized regions),同步原語例如互斥量(mutexes)鎖定和完成異步端口,同步上下文來保證所有的共享資源以線程安全的方式被使用。


          對于可交互性來說,CLR(common language runtime)在調用COM對象時,創建并初始化一個套間,一個托管的線程可以創建并且進入一個包含一個線程的single-threaded apartment (STA)或者包含多個線程的multi-threaded apartment (MTA)。當COM的套間和線程的套間兼容的時候,COM允許調用的線程直接調用COM對象的方法,如果套間不兼容,COM創建兼容的套間并通過代理列集(marshals)所有的調用。

           
          在第一個對非托管代碼的調用時,運行時調用CoInitializeEx來初始化MTA或者STA的COM套間。可以使用System.Threading.ApartmentState屬性來控制創建的套間的類型是MTA, STA, 或者Unknown.在代理存根或者TLB已經注冊后,不一定義定設定要設定這個屬性。
          下表列出了ApartmentState的枚舉值和對應的COM套間初始化調用

          ApartmentState enumeration value
          COM apartment initialization
          MTA
          CoInitializeEx(NULL, COINIT_MULTITHREADED)
          STA
          CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)
          Unknown
          CoInitializeEx(NULL, COINIT_MULTITHREADED)

          COM對象和托管線程在不兼容的套間時,所有的調用都通過COM創建的代理,下面的代碼例子顯示了怎么在托管代碼重創建一個STA套間模型的COM對象AptSimple


          [C#]
          using System.Threading;
          using APTOBJLib;
          ...
          AptSimple obj = new AptSimple ();
          obj.Counter = 1;
          為了消除代理存根,顯著的提高性能,注意創建對象之前的ApartmentState
          [C#]
          using System.Threading;
          using APTOBJLib;
          ...
          Thread.CurrentThread.ApartmentState = ApartmentState.STA;
          AptSimple obj = new AptSimple ();
          obj.Counter = 1;
          設定套間狀態之后,可以向下面那樣通過程序查詢狀態
          [C#]
          Thread.CurrentThread.ApartmentState = ApartmentState.STA;
          if (Thread.CurrentThread.ApartmentState == ApartmentState.STA) {
          // All is OK.
          }
          else {
          // Incompatible apartment state.
          }

          3 托管和非托管的事件(Managed and Unmanaged Events)

          .NET Framework的事件模型與傳統的COM的事件模型不同。托管的事件模型基于委托(delegate),er非托管的事件(在COM中)基于連接點(connection points)。兩個模型都是緊耦合的事件系統,因為客戶(事件接受者)和服務(事件發送者)必須同時的運行。

          這一部分描述了怎樣過渡托管和非托管的事件系統,使得對象可以跨域交互邊界發送和接收事件。

          COM 事件
          這部分提供關于連接點的概要介紹以及用來說明COM事件相關的通用術語
          連接點在客戶和COM的服務器之間確立了一種雙向de通信機制。通過這種機制,COM服務器在事件發生時可以回調客戶。例如,服務器(像Microsoft Internet Explorer)可以發出一個事件來向客戶程序報告一個變化(例如標題變化)。客戶創建了一個叫做event sink內部的COM對象來響應通知,當收到通知,客戶可以執行事件相關的操作。


          event sink提供了向服務器暴露事件相關方法的接口。服務器通過這些事件相關的方法激發事件。客戶像實現普通的COM接口一樣實現event sink接口。服務器聲明這個接口為出接口,COM服務的作者在類型庫中隊這個接口應用source 屬性。服務器使用event sink接口的定義來確定sink并且invoke方法


          實現了event sink接口的COM客戶通常叫做event sink,或者簡單的稱為sink。
          在下圖中,sink實現了ISinkEvents接口,服務器可以激發事件
          連接點事件模型(Connection point event model)



          event sink的接口確定之后,sink必須與源對象建立連接,連接點的機制使用下面的過程連接sink和source:
          1. The sink queries a server object for the IConnectionPointContainer interface. If the object supports connection points, it returns a pointer.
          2. Using methods on the container object, the sink locates the IConnectionPoint interface representing a specific connection point. Since a server can support multiple outgoing interfaces, a client must match its sink to the interface identifier (IID) of a particular connection point interface.
          3. Having obtained the correct connection point object, the sink calls IConnectionPoint::Advise to register its sink interface pointer. The server (source) holds the connection (and raises events to it) until the client breaks the connection by calling IConnectionPoint::Unadvise.


          處理COM源發出的事件(Handling Events Raised by a COM Source)
          如果你不熟悉.NET Framework提供的基于委托(delegate-based)的事件模型,參考Handling and Raising Events。

          An imported delegate signature comprises the sink event interface, an underscore, the event name, and the word EventHandler: SinkEventInterface_EventNameEventHandler.
          .NET的客戶(event sink)可以接受現存的COM服務器(event source)的事件。COM interop在你的托管客戶的元數據中產生必要的委托。一個導入的委托簽名(signature)由sink event接口,一個下劃線,事件名稱和EventHandler組成


          與現存的COM事件源交互(To interoperate with an existing COM event source)
          1. Obtain the primary interop assembly for the COM server if the COM types are to be shared by other applications. A primary interop assembly contains metadata representing the converted type library and is signed by the publisher.
          Note If the primary interop assembly is not available or if the assembly is to be used privately, you can import the type library by using Tlbimp.exe or an equivalent API.
          The conversion process generates a delegate for each event; however, you only have to sink the events that interest you.
          2. You can use a metadata browser, such as Ildasm.exe, to identify events delegates.
          3. Consume events from the COM event source the same way you consume events from a managed event source.
          下面的例子說明了怎樣打開一個Internet Explorer窗口,得到Internet Explorer對象發出的事件并在托管的代碼中處理。Internet Explorer的類型(包括事件委托)的定義從被SHDocVw.dll導入為元數據,例子激發TitleChange事件
           

          [C#]
          namespace InternetExplorer
          {
              using System;
              using System.Runtime.InteropServices;
              using SHDocVw;
           
              public class Explorer
              {
                  public static void Main()
                  {
                      Explorer explorer = new Explorer();
                      explorer.Run();
                  }
                  public void Run()
                  {
                      Object o = null;
                      String s;
           
                      try
                      {
                          // Starts the browser.
                          m_IExplorer = new SHDocVw.InternetExplorer();
                      }
                      catch(Exception e)
                      {
                          Console.WriteLine("Exception when creating Internet
                          Explorer object {0}", e);
                          return;
                      }
           
                      // Wires your event handlers to m_IExplorer.
                      SetAllEvents();
           
                      try
                      { 
                          // Goes to the home page.
                          m_WebBrowser = (IWebBrowserApp) m_IExplorer;
                          m_WebBrowser.Visible = true;
                          m_WebBrowser.GoHome();
           
                          // Starts navigating to different URLs.
                          Console.Write("Enter URL (or enter to quit): ");
                          s = Console.ReadLine();
                          while (s != "" && m_IExplorer != null &&
                              m_WebBrowser != null)
                          {
                              m_WebBrowser.Navigate(s, ref o, ref o, ref o,
                                    ref o);
                              Console.Write("Enter URL (or enter to quit): ");     
                              s = Console.ReadLine();
                          }
           
                          m_WebBrowser.Quit();
                      }
                      catch(Exception sE)
                      {
                          if (m_IExplorer == null && m_WebBrowser == null)
                          {
                              Console.WriteLine("Internet Explorer has gone away");
                          }
                          else
                          {
                              Console.WriteLine("Exception happens {0}", sE);
                          }
                      }
                  }
                  // Uses the += syntax for adding delegates to events.
                  void SetAllEvents()
                  {
                      if (m_IExplorer != null)
                      {
                          // Title Change event
                          // DWebBrowserEvents2 is the name of the sink event
                          //interface.
                          // TitleChange is the name of the event.
                          // DWebBrowserEvents2_TitleChangeEventHandler is the
                          // delegate name assigned by TlbImp.exe.
                          DWebBrowserEvents2_TitleChangeEventHandler
               DTitleChangeE = new DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange);
                        m_IExplorer.TitleChange += DTitleChangeE;
                      }
                  }
          ///////////////////////////////////////////////////////////////////////
                  // Define event handlers.
                  // Document title changed
                  static void OnTitleChange(String Text)
                  {
                      Console.WriteLine("Title changes to {0}", Text);
                  }
            
          //////////////////////////////////////////////////////////////////////////
                  // The following are class fields.
                  static private SHDocVw.InternetExplorer m_IExplorer = null;
                  static private IWebBrowserApp m_WebBrowser = null;
              }
          }

          posted @ 2007-07-25 11:19 Picasso 閱讀(2456) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 麻江县| 苗栗市| 汶上县| 临邑县| 苍山县| 衡阳市| 枣庄市| 鸡西市| 潜江市| 宁远县| 丹阳市| 九龙县| 虎林市| 五莲县| 南乐县| 寿光市| 宝兴县| 崇义县| 来凤县| 雷州市| 炎陵县| 宜城市| 博爱县| 汕尾市| 武宁县| 潜山县| 新余市| 富裕县| 冀州市| 宜良县| 九龙坡区| 东莞市| 凤阳县| 临潭县| 平原县| 剑川县| 惠安县| 合阳县| 云浮市| 宾阳县| 临澧县|