一、查看是否安裝NFS(portmap是用于RPC傳輸?shù)模?br /># rpm -q nfs-utils portmap
          nfs-utils-1.0.9-47.el5_5
          portmap-4.0-65.2.2.1
          二、配置
          1。配置文件
          # vi /etc/exports
          配置實(shí)例:
          1)/nfs/public 192.168.16.0/24(rw,async) *(ro)
          共享目錄    客戶機(jī)1                   客戶機(jī)2
          nfs/public共享目錄可供子網(wǎng)192.168.16.0/24中的所有客戶端進(jìn)行讀寫操作,其它網(wǎng)絡(luò)中的客戶端只能有讀取操作權(quán)限。
          2)/home/test 192.168.0.0/24(rw,no_root_squash,async)
          no_root_squash:不講root用戶及所屬用戶組映射為匿名用戶或用戶組,默認(rèn)root是被映射為匿名用戶的nfsnobody,所有即使開了rw寫權(quán)限,客戶機(jī)也使無法寫入的,這個(gè)不映射為匿名用戶,還保留原來的用戶權(quán)限就可以讀寫了,因?yàn)橐话愣际怯胷oot用戶登錄的。
          注意:當(dāng)客機(jī)是否有寫權(quán)限時(shí),還要看該目錄對(duì)該用戶有沒有開放寫入權(quán)限
           
          三、維護(hù)NFS
          格式:
          exportfs 選項(xiàng)參數(shù)
          -a:輸出/etc/exports中設(shè)置的所有目錄
          -r:重新讀取/etc/exports文件中的設(shè)置,并且立即生效,而不需要重新啟動(dòng)NFS服務(wù)。
          -u:停止輸出某一目錄
          -v:在輸出目錄時(shí),將目錄顯示在屏幕上。
          1.修改vi /etc/exports后,不用重啟服務(wù),直接使用命令輸出共享目錄
          # exportfs -rv
          2.停止輸出所有共享目錄
          # exportfs -auv
          四、啟動(dòng)和停止NFS服務(wù)
          1.啟動(dòng)NFS服務(wù)
          為了是NFS正常工作,需要啟動(dòng)portmap和nfs這兩個(gè)目錄,并且portmap一定要先于nfs啟動(dòng)。
          # /etc/init.d/portmap start
          # /etc/init.d/nfs start
          2.停止NFS 服務(wù)
          停止NFS服務(wù)器前,需要先停止NFS服務(wù)再停止portmap服務(wù)。如果系統(tǒng)中還有其它服務(wù)需要portmap時(shí),則可以不用停止portmap服務(wù)。
          /etc/init.d/nfs stop
          /etc/init.d/portmap stop
          3。自啟動(dòng)NFS服務(wù)
          chkconfig --level 35 portmap on
          chkconfig --level 35 nfs on
          五、測(cè)試
          1.檢查輸出目錄所使用的選項(xiàng)
          在/etc/exports配置文件中,即使只設(shè)置了一兩個(gè)選項(xiàng),在真正輸出目錄時(shí),實(shí)際上還帶了很多某人選項(xiàng)。通過查看 /var/lib/nfs/etab文件,就可以知道真正輸出目錄時(shí),都是用了什么選項(xiàng)。
          2.使用showmount測(cè)試NFS輸出目錄狀態(tài)
          格式:
          showmount 參數(shù)選項(xiàng) nfs服務(wù)器名稱或地址
          -a:顯示指定的nfs服務(wù)器的所有客戶端主機(jī)及其所連接的目錄
          -d:顯示指定的nfs服務(wù)器中已經(jīng)被客戶端連接的所有共享目錄
          -e:顯示指定的nfs服務(wù)器上所有輸出的共享目錄
          (1)查看所有輸出的共享目錄
          # showmount -e
          (2)顯示所有被掛載的所有輸出目錄
          # showmount -d
           六、nfs客戶端使用配置
          1.查看nfs服務(wù)器信息
          在客戶端,要查看nfs服務(wù)器上有哪些共享目錄,可以使用showmount命令。
          # showmount -e 192.168.0.51
          如果出現(xiàn)報(bào)錯(cuò)信息,首先查看服務(wù)器nfs和portmap服務(wù)是否啟動(dòng)。再看是否被防火墻屏蔽掉了。
          2.掛載nfs服務(wù)器上的共享目錄
           # mount -t nfs 192.168.0.51:/home/test /mnt/
          -t:指定掛載設(shè)備的文件類型(nfs是網(wǎng)絡(luò)文件系統(tǒng))
          192.168.0.51:nfs服務(wù)器ip地址
          /home/test :nfs服務(wù)器的共享目錄
          /mnt/:掛載在本地的目錄
          3.卸載nfs
          在不使用nfs目錄時(shí),可以用umount命令來卸載該目錄
          注意:當(dāng)有客戶機(jī)正在連接nfs服務(wù)器時(shí),此時(shí)想要將nfs服務(wù)器關(guān)機(jī),應(yīng)該先關(guān)掉portmap和nfs這兩個(gè)服務(wù),否則要等很久才能正常關(guān)機(jī)。如果無法將portmap和nfs關(guān)掉,就直接kill掉進(jìn)程。也可以用exportmap -auv命令將當(dāng)前主機(jī)中的所有輸出目錄停止后再關(guān)機(jī)。
           
           4.啟動(dòng)時(shí)自動(dòng)連接nfs服務(wù)器
          要先在啟動(dòng)時(shí)自動(dòng)連接nfs服務(wù)器上的共享目錄,要編輯/etc/fstab文件。在文件中加入
          192.168.0.51:/home/test /mnt nfs defaults 0 0
          192.168.0.51:/home/test:nfs服務(wù)器的共享目錄
          /mnt:本機(jī)掛載目錄
           
          -------------------------------------------------
          拷貝時(shí)cp命令常用參數(shù)
          cp -a -v /mnt /home/
          - a 該選項(xiàng)通常在拷貝目錄時(shí)使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項(xiàng)的組合。
          -v或–verbose  顯示指令執(zhí)行過程。
          -V<備份方式>或–version-control=<備份方式>  用”-b”參數(shù)備份目標(biāo)文件后,備份文件的字尾會(huì)被加上一個(gè)備份字符串,這字符串不僅可用”-S”參數(shù)變更,當(dāng)使用”-V”參數(shù)指定不同備份方式時(shí),也會(huì)產(chǎn)生不同字尾的備份字串。
          - i 和f選項(xiàng)相反,在覆蓋目標(biāo)文件之前將給出提示要求用戶確認(rèn)。回答y時(shí)目標(biāo)文件將被覆蓋,是交互式拷貝。
          posted @ 2012-07-19 13:08 姚先進(jìn) 閱讀(955) | 評(píng)論 (0)編輯 收藏
           

          SIGHUP     終止進(jìn)程     終端線路掛斷
          SIGINT     終止進(jìn)程     中斷進(jìn)程
          SIGQUIT   建立CORE文件終止進(jìn)程,并且生成core文件
          SIGILL   建立CORE文件       非法指令
          SIGTRAP   建立CORE文件       跟蹤自陷
          SIGBUS   建立CORE文件       總線錯(cuò)誤
          SIGSEGV   建立CORE文件       段非法錯(cuò)誤
          SIGFPE   建立CORE文件       浮點(diǎn)異常
          SIGIOT   建立CORE文件       執(zhí)行I/O自陷
          SIGKILL   終止進(jìn)程     殺死進(jìn)程
          SIGPIPE   終止進(jìn)程     向一個(gè)沒有讀進(jìn)程的管道寫數(shù)據(jù)
          SIGALARM   終止進(jìn)程     計(jì)時(shí)器到時(shí)
          SIGTERM   終止進(jìn)程     軟件終止信號(hào)
          SIGSTOP   停止進(jìn)程     非終端來的停止信號(hào)
          SIGTSTP   停止進(jìn)程     終端來的停止信號(hào)
          SIGCONT   忽略信號(hào)     繼續(xù)執(zhí)行一個(gè)停止的進(jìn)程
          SIGURG   忽略信號(hào)     I/O緊急信號(hào)
          SIGIO     忽略信號(hào)     描述符上可以進(jìn)行I/O
          SIGCHLD   忽略信號(hào)     當(dāng)子進(jìn)程停止或退出時(shí)通知父進(jìn)程
          SIGTTOU   停止進(jìn)程     后臺(tái)進(jìn)程寫終端
          SIGTTIN   停止進(jìn)程     后臺(tái)進(jìn)程讀終端
          SIGXGPU   終止進(jìn)程     CPU時(shí)限超時(shí)
          SIGXFSZ   終止進(jìn)程     文件長度過長
          SIGWINCH   忽略信號(hào)     窗口大小發(fā)生變化
          SIGPROF   終止進(jìn)程     統(tǒng)計(jì)分布圖用計(jì)時(shí)器到時(shí)
          SIGUSR1   終止進(jìn)程     用戶定義信號(hào)1
          SIGUSR2   終止進(jìn)程     用戶定義信號(hào)2
          SIGVTALRM 終止進(jìn)程     虛擬計(jì)時(shí)器到時(shí)

          1) SIGHUP 本信號(hào)在用戶終端連接(正常或非正常)結(jié)束時(shí)發(fā)出, 通常是在終端的控
          制進(jìn)程結(jié)束時(shí), 通知同一session內(nèi)的各個(gè)作業(yè), 這時(shí)它們與控制終端
          不再關(guān)聯(lián).
          2) SIGINT 程序終止(interrupt)信號(hào), 在用戶鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出
          3) SIGQUIT 和SIGINT類似, 但由QUIT字符(通常是Ctrl-)來控制. 進(jìn)程在因收到
          SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件, 在這個(gè)意義上類似于一個(gè)程序錯(cuò)誤信
          號(hào).
          4) SIGILL 執(zhí)行了非法指令. 通常是因?yàn)榭蓤?zhí)行文件本身出現(xiàn)錯(cuò)誤, 或者試圖執(zhí)行
          數(shù)據(jù)段. 堆棧溢出時(shí)也有可能產(chǎn)生這個(gè)信號(hào).
          5) SIGTRAP 由斷點(diǎn)指令或其它trap指令產(chǎn)生. 由debugger使用.
          6) SIGABRT 程序自己發(fā)現(xiàn)錯(cuò)誤并調(diào)用abort時(shí)產(chǎn)生.
          6) SIGIOT 在PDP-11上由iot指令產(chǎn)生, 在其它機(jī)器上和SIGABRT一樣.
          7) SIGBUS 非法地址, 包括內(nèi)存地址對(duì)齊(alignment)出錯(cuò). eg: 訪問一個(gè)四個(gè)字長
          的整數(shù), 但其地址不是4的倍數(shù).
          8) SIGFPE 在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出. 不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤, 還包括溢
          出及除數(shù)為0等其它所有的算術(shù)的錯(cuò)誤.
          9) SIGKILL 用來立即結(jié)束程序的運(yùn)行. 本信號(hào)不能被阻塞, 處理和忽略.
          10) SIGUSR1 留給用戶使用
          11) SIGSEGV 試圖訪問未分配給自己的內(nèi)存, 或試圖往沒有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù).
          12) SIGUSR2 留給用戶使用
          13) SIGPIPE Broken pipe
          14) SIGALRM 時(shí)鐘定時(shí)信號(hào), 計(jì)算的是實(shí)際的時(shí)間或時(shí)鐘時(shí)間. alarm函數(shù)使用該
          信號(hào).
          15) SIGTERM 程序結(jié)束(terminate)信號(hào), 與SIGKILL不同的是該信號(hào)可以被阻塞和
          處理. 通常用來要求程序自己正常退出. shell命令kill缺省產(chǎn)生這
          個(gè)信號(hào).
          17) SIGCHLD 子進(jìn)程結(jié)束時(shí), 父進(jìn)程會(huì)收到這個(gè)信號(hào).
          18) SIGCONT 讓一個(gè)停止(stopped)的進(jìn)程繼續(xù)執(zhí)行. 本信號(hào)不能被阻塞. 可以用
          一個(gè)handler來讓程序在由stopped狀態(tài)變?yōu)槔^續(xù)執(zhí)行時(shí)完成特定的
          工作. 例如, 重新顯示提示符
          19) SIGSTOP 停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:
          該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號(hào)不能被阻塞, 處理或忽略.
          20) SIGTSTP 停止進(jìn)程的運(yùn)行, 但該信號(hào)可以被處理和忽略. 用戶鍵入SUSP字符時(shí)
          (通常是Ctrl-Z)發(fā)出這個(gè)信號(hào)
          21) SIGTTIN 當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí), 該作業(yè)中的所有進(jìn)程會(huì)收到SIGTTIN
          信號(hào). 缺省時(shí)這些進(jìn)程會(huì)停止執(zhí)行.
          22) SIGTTOU 類似于SIGTTIN, 但在寫終端(或修改終端模式)時(shí)收到.
          23) SIGURG 有"緊急"數(shù)據(jù)或out-of-band數(shù)據(jù)到達(dá)socket時(shí)產(chǎn)生.
          24) SIGXCPU 超過CPU時(shí)間資源限制. 這個(gè)限制可以由getrlimit/setrlimit來讀取/
          改變
          25) SIGXFSZ 超過文件大小資源限制.
          26) SIGVTALRM 虛擬時(shí)鐘信號(hào). 類似于SIGALRM, 但是計(jì)算的是該進(jìn)程占用的CPU時(shí)間.
          27) SIGPROF 類似于SIGALRM/SIGVTALRM, 但包括該進(jìn)程用的CPU時(shí)間以及系統(tǒng)調(diào)用的
          時(shí)間.
          28) SIGWINCH 窗口大小改變時(shí)發(fā)出.
          29) SIGIO 文件描述符準(zhǔn)備就緒, 可以開始進(jìn)行輸入/輸出操作.
          30) SIGPWR Power failure

          有兩個(gè)信號(hào)可以停止進(jìn)程:SIGTERM和SIGKILL。 SIGTERM比較友好,進(jìn)程能捕捉這個(gè)信號(hào),根據(jù)您的需要來關(guān)閉程序。在關(guān)閉程序之前,您可以結(jié)束打開的記錄文件和完成正在做的任務(wù)。在某些情況下,假如進(jìn)程正在進(jìn)行作業(yè)而且不能中斷,那么進(jìn)程可以忽略這個(gè)SIGTERM信號(hào)。

          對(duì)于SIGKILL信號(hào),進(jìn)程是不能忽略的。這是一個(gè) “我不管您在做什么,立刻停止”的信號(hào)。假如您發(fā)送SIGKILL信號(hào)給進(jìn)程,Linux就將進(jìn)程停止在那里。


          posted @ 2012-07-17 11:33 姚先進(jìn) 閱讀(171) | 評(píng)論 (0)編輯 收藏
           

          視頻類型PAL和NTSC的區(qū)別

            NTSC是National Television Systems Committee的縮寫,意思是“國家電視系統(tǒng)委員會(huì)制式”。
            
            NTSC負(fù)責(zé)開發(fā)一套美國標(biāo)準(zhǔn)電視廣播傳輸和接收協(xié)議。此外還有兩套標(biāo)準(zhǔn):逐行倒像(PAL)和順序與存色彩電視系統(tǒng)(SECAM),用于世界上其他的國家。NTSC標(biāo)準(zhǔn)從他們產(chǎn)生以來除了增加了色彩信號(hào)的新參數(shù)之外沒有太大的變化。NTSC信號(hào)是不能直接兼容于計(jì)算機(jī)系統(tǒng)的。
            
            NTSC電視全屏圖像的每一幀有525條水平線。這些線是從左到右從上到下排列的。每隔一條線是跳躍的。所以每一個(gè)完整的幀需要掃描兩次屏幕:第一次掃描是奇數(shù)線,另一次掃描是偶數(shù)線。每次半幀屏幕掃描需要大約1/60秒;整幀掃描需要1/30秒。這種隔行掃描系統(tǒng)也叫interlacing(也是隔行掃描的意思)。適配器可以把NTSC信號(hào)轉(zhuǎn)換成為計(jì)算機(jī)能夠識(shí)別的數(shù)字信號(hào)。相反地還有種設(shè)備能把計(jì)算機(jī)視頻轉(zhuǎn)成NTSC信號(hào),能把電視接收器當(dāng)成計(jì)算機(jī)顯示器那樣使用。但是由于通用電視接收器的分辨率要比一臺(tái)普通顯示器低,所以即使電視屏幕再大也不能適應(yīng)所有的計(jì)算機(jī)程序。
            
            近幾年,行業(yè)里迫切的需要采用一套新的電視標(biāo)準(zhǔn)。有種提議使用協(xié)議是高清晰電視(HDTV)。HDTV標(biāo)準(zhǔn)可以完全的被計(jì)算機(jī)系統(tǒng)直接兼容。然而仍然有些設(shè)計(jì)上的問題沒有解決。有些業(yè)內(nèi)專家擔(dān)心這樣的兼容性會(huì)嚴(yán)重增加通用電視機(jī)的成本。
            
            PAL制式是電視廣播中色彩編碼的一種方法,全名為 Phase Alternating Line 逐行倒相。它是西德在1962年指定的彩色電視廣播標(biāo)準(zhǔn),它采用逐行倒相正交平衡調(diào)幅的技術(shù)方法,克服了NTSC制相位敏感造成色彩失真的缺點(diǎn)。西德、英國等一些西歐國家,新加坡、中國大陸及香港,澳大利亞、新西蘭等國家采用這種制式。PAL由德國人Walter Bruch在1967年提出,當(dāng)時(shí)他是為德律風(fēng)根(Telefunken)工作。“PAL”有時(shí)亦被用來指625 線,每秒25格,隔行掃描, PAL色彩編碼的電視制式。PAL制式中根據(jù)不同的參數(shù)細(xì)節(jié),又可以進(jìn)一步劃分為G、I、D等制式,其中PAL-D制是我國大陸采用的制式
          posted @ 2012-07-16 10:17 姚先進(jìn) 閱讀(566) | 評(píng)論 (0)編輯 收藏
           

          man函數(shù)輸入?yún)?shù)分析

          argv: 指針的指針
           
          argc: 整數(shù)
           
          char **argv or char *argv[] or char argv[][]
           
           
          為了能形象的說明這兩個(gè)參數(shù)的含義,我們先用一個(gè)實(shí)例來進(jìn)行講解:
           
           
          假設(shè)程序的名稱為test,當(dāng)只輸入test,則由操作系統(tǒng)傳來的參數(shù)為:
           
          argc = 1,表示只有一程序名稱;
           
          argc只有一個(gè)元素,argv[0]指向輸入的程序路徑及名稱:./ test
           
           
          當(dāng)輸入test para_1,有一個(gè)參數(shù),則由操作系統(tǒng)傳來的參數(shù)為:
           
          argc = 2,表示除了程序名外還有一個(gè)參數(shù);
           
          argv[0]指向輸入的程序路徑及名稱;
           
          argv[1]指向參數(shù)para_1字符串
           
           
          當(dāng)輸入test para_1 para_2 有2個(gè)參數(shù),則由操作系統(tǒng)傳來的參數(shù)為:
           
          argc = 3,表示除了程序名外還有兩個(gè)參數(shù);
           
          argv[0]指向輸入的程序路徑及名稱;
           
          argv[1]指向參數(shù)para_1字符串;
           
          argv[2]指向參數(shù)para_2字符串;
           
          以此類推………………
           
           
          void main( int argc, char *argv[] )
           
          char *argv[]: argv是一個(gè)指針數(shù)組,元素個(gè)數(shù)是argc,存放的是指向每一個(gè)參數(shù)的指針,第一個(gè)元素即argv[0]為程序運(yùn)行的全路徑名,從二個(gè)元素(argv[1])開始,是每一個(gè)參數(shù)的名稱,最后一個(gè)元素為NULL。總的來說,即:
           
          * argv: 字符串?dāng)?shù)組
           
          argv[0] 為程序運(yùn)行的全路徑名
           
          argv[1] 為執(zhí)行程序名后的第一個(gè)字符串;
           
          argv[2] 為執(zhí)行程序名后的第二個(gè)字符串;
           
          ...
           
          argv[argc]為NULL。
           
          int argc: 表示argv的大小,是實(shí)際參數(shù)個(gè)數(shù)+1,其中+1是因?yàn)閍rgv[0]是編譯后的可執(zhí)行文件名
           
           
          main() 參數(shù) :
           
          Turbo C2.0啟動(dòng)時(shí)總是把a(bǔ)rgc、argv、env(存放環(huán)境變量)這三個(gè)參數(shù)傳遞給main()函數(shù), 可以在用戶程序中說明(或不說明)它們, 如果說明了部分(或全部)參數(shù), 它們就成為main()子程序的局部變量。
           
          請(qǐng)注意: 一旦想說明這些參數(shù), 則必須按argc, argv, env 的順序, 如以下的例子:
           
          main()
           
          main(int argc)
           
          main(int argc, char *argv[])
           
          main(int argc, char *argv[], char *env[])
           
          其中第二種情況是合法的, 但不常見, 因?yàn)樵诔绦蛑泻苌儆兄挥胊rgc, 而不
           
          用argv[]的情況。
           
          以下提供一樣例程序EXAMPLE.EXE, 演示如何在main()函數(shù)中使用三個(gè)參數(shù):
           
           
          #include <stdio.h>
           
          #include <stdlib.h>
           
          main(int argc, char *argv[], char *env[])
           
          {
           
          int i;
           
          printf( "These are the %d command- line arguments passed to
           
          main:\n\n", argc);
           
          for( i = 0; i <= argc; i++)
           
          printf( "argv[%d]:%s\n", i, argv[i] );
           
          printf( "\nThe environment string(s)on this system are:\n\n");
           
          for( i = 0; env[i] != NULL; i++ )
           
          printf( " env[%d]:%s\n", i, env[i] );
           
          }
           
          ./EXAMPLE first "I’m a good boy" c "last " stop
           
          注意: 可以用雙引號(hào)括起內(nèi)含空格的參數(shù), 如本例中的: " argument with blanks"和"Last but one")。
           
          結(jié)果是這樣的:
           
          These are the 6 command-linearguments passed to main:
           
          argv[0]:./ EXAMPLE
           
          argv[1]:first
           
          argv[2]: I’m a good boy
           
          argv[3]:c
           
          argv[4]: last
           
          argv[5]:stop
           
          argv[6]:(NULL)

          posted @ 2012-07-16 09:15 姚先進(jìn) 閱讀(276) | 評(píng)論 (0)編輯 收藏
           
          Source Insight實(shí)質(zhì)上是一個(gè)支持多種開發(fā)語言(java,c ,c 等等)的編輯器,只不過由于其查找、定位、彩色顯示等功能的強(qiáng)大,常被我們當(dāng)成源代碼閱讀工具使用。
          作為一個(gè)開放源代碼的操作系統(tǒng),Linux附帶的源代碼庫使得廣大愛好者有了一個(gè)廣泛學(xué)習(xí)、深入鉆研的機(jī)會(huì),特別是Linux內(nèi)核的組織極為復(fù)雜,同時(shí),又不能像windows平臺(tái)的程序一樣,可以使用集成開發(fā)環(huán)境通過察看變量和函數(shù),甚至設(shè)置斷點(diǎn)、單步運(yùn)行、調(diào)試等手段來弄清楚整個(gè)程序的組織結(jié)構(gòu),使得Linux內(nèi)核源代碼的閱讀變得尤為困難。
          當(dāng)然Linux下的vim和emacs編輯程序并不是沒有提供變量、函數(shù)搜索,彩色顯示程序語句等功能。它們的功能是非常強(qiáng)大的。比如,vim和emacs就各自內(nèi)嵌了一個(gè)標(biāo)記程序,分別叫做ctag和etag,通過配置這兩個(gè)程序,也可以實(shí)現(xiàn)功能強(qiáng)大的函數(shù)變量搜索功能,但是由于其配置復(fù)雜,linux附帶的有關(guān)資料也不是很詳細(xì),而且,即使建立好標(biāo)記庫,要實(shí)現(xiàn)代碼彩色顯示功能,仍然需要進(jìn)一步的配置(在另一片文章,我將會(huì)講述如何配置這些功能),同時(shí),對(duì)于大多數(shù)愛好者來說,可能還不能熟練使用vim和emacs那些功能比較強(qiáng)大的命令和快捷鍵。
          為了方便的學(xué)習(xí)Linux源程序,我們不妨回到我們熟悉的window環(huán)境下,也算是“師以長夷以制夷”吧。但是在Window平臺(tái)上,使用一些常見的集成開發(fā)環(huán)境,效果也不是很理想,比如難以將所有的文件加進(jìn)去,查找速度緩慢,對(duì)于非Windows平臺(tái)的函數(shù)不能彩色顯示。于是筆者通過在互聯(lián)網(wǎng)上搜索,終于找到了一個(gè)強(qiáng)大的源代碼編輯器,它的卓越性能使得學(xué)習(xí)Linux內(nèi)核源代碼的難度大大降低,這便是Source Insight3.0,它是一個(gè)Windows平臺(tái)下的共享軟件,可以從 http://www.sourceinsight.com/上邊下載30天試用版本。由于Source Insight是一個(gè)Windows平臺(tái)的應(yīng)用軟件,所以首先要通過相應(yīng)手段把Linux系統(tǒng)上的程序源代碼弄到Windows平臺(tái)下,這一點(diǎn)可以通過在linux平臺(tái)上將/usr/src目錄下的文件拷貝到Windows平臺(tái)的分區(qū)上,或者從網(wǎng)上光盤直接拷貝文件到Windows平臺(tái)的分區(qū)來實(shí)現(xiàn)。
          下面主要講解如何使用Source Insight,考慮到閱讀源程序的愛好者都有相當(dāng)?shù)能浖褂盟剑疚膶?duì)于一些瑣碎、人所共知的細(xì)節(jié)略過不提,僅介紹一些主要內(nèi)容,以便大家能夠很快熟練使用本軟件,減少摸索的過程。
          安裝Source Insight并啟動(dòng)程序,可以進(jìn)入圖1界面。在工具條上有幾個(gè)值得注意的地方,如圖所示,圖中內(nèi)凹左邊的是工程按鈕,用于顯示工程窗口的情況;右邊的那個(gè)按鈕按下去將會(huì)顯示一個(gè)窗口,里邊提供光標(biāo)所在的函數(shù)體內(nèi)對(duì)其他函數(shù)的調(diào)用圖,通過點(diǎn)擊該窗體里那些函數(shù)就可以進(jìn)入該函數(shù)所在的地方。

          圖1 Source Insight界面圖

          由于Source Insight實(shí)質(zhì)上是一個(gè)支持多種開發(fā)語言(java,c ,c++等等)的編輯器,只不過由于其查找、定位、彩色顯示等功能的強(qiáng)大,而被我們當(dāng)成源代碼閱讀工具使用。所以,為了有效的閱讀源程序,首先必須選擇功能菜單上的 “Project”選項(xiàng)的子菜單“New Project”新建一個(gè)項(xiàng)目,項(xiàng)目名稱可以自由選定,當(dāng)然也可以選擇刪除(Remove)一個(gè)項(xiàng)目。當(dāng)刪除一個(gè)項(xiàng)目的時(shí)候,并不刪除原有的源代碼文件,只是將該軟件生成的那些工程輔助文件刪除。設(shè)定之后,將會(huì)彈出一個(gè)對(duì)話框如圖2,接受默認(rèn)選擇,如果,硬盤空間足夠,可以將第一個(gè)復(fù)選框選上,該選項(xiàng)將會(huì)需要與源代碼大致同等的空間來建立一個(gè)本地?cái)?shù)據(jù)庫以加快查找的速度。
          圖2 工程設(shè)置

          點(diǎn)擊“OK”按鈕,接受選擇后,將會(huì)有一個(gè)新的對(duì)話框彈出,在這個(gè)對(duì)話框里,可以選擇將要閱讀的文件加入工程,一種方式是通過在File Name中輸入要閱讀源代碼文件的名稱,點(diǎn)擊“Add”按鈕將其加入,也可以通過其中“Add All”和“Add Tree”兩個(gè)按鈕可以將選中目錄的所有文件加入到工程中,其中“Add All”選項(xiàng)會(huì)提示加入頂層文件和遞歸加入所有文件兩種方式,而“Add Tree”相當(dāng)于“Add All”選項(xiàng)的遞歸加入所有文件,可以根據(jù)需要使用,就我來說,更喜歡“Add Tree”一些。由于該程序采用了部分打開文件的方式,沒有用到的文件不會(huì)打開,所以,加入數(shù)千個(gè)文件也不用擔(dān)心加入的文件超出程序的所能容忍的最大值,我就是采用“Add Tree”的方式將Linux2.4內(nèi)核的四千五百九十一個(gè)文件加入的。

          圖3 添加文件

          加入文件后,點(diǎn)擊一個(gè)文件,可以出現(xiàn)使用界面,如圖4所示,其中,右邊的那個(gè)窗口(Linux Project,即工程窗口)缺省按照字母順序列出當(dāng)前工程中所有的文件。

          圖4 工作窗口

          點(diǎn)擊一個(gè)文件就可以打開該文件,顯示如圖5所示,進(jìn)入到右邊的那個(gè)窗口分別可以以文件列表的方式,列出所有的文件,每個(gè)窗體下邊有一排按鈕,左邊的窗口(21142.c)從左至右分別為:按字母順序排列所有標(biāo)記、按照文件中行數(shù)順序排列標(biāo)記、按照類型排列標(biāo)記、瀏覽本地文件標(biāo)記、標(biāo)記窗口屬性。右邊的窗口(Linux Project)從左至右分別為:按字母順序文件列表、顯示文件夾、按照文件類型歸類文件、全部文件的所有標(biāo)記列表、按照標(biāo)記類型歸類標(biāo)記、跳轉(zhuǎn)到定義處、顯示標(biāo)記信息、瀏覽工程標(biāo)記、查找函數(shù)調(diào)用、工程屬性,其中全部文件的所有標(biāo)記列表選項(xiàng)可能要一段時(shí)間抽取標(biāo)記,同步到數(shù)據(jù)庫去,如果開始選擇了建立標(biāo)記數(shù)據(jù)庫,將會(huì)在今后節(jié)省同步時(shí)間,最有用的莫過于瀏覽標(biāo)記信息和查找函數(shù)調(diào)用,前者可以通過“Jump”按鈕在不同的地方查找同樣的標(biāo)志,還可以通過“Reference”按鈕結(jié)合后者進(jìn)行全局的標(biāo)記查找。


          Reference功能是Source Insight的特色之一,它可以在速度極快的在整個(gè)工程中找到所有的標(biāo)記,并且在該行程序的前邊加上紅色箭頭的小按鈕鏈接上。圖6是一個(gè)Reference搜索后的結(jié)果,它可以有兩種模式,一種集中顯示結(jié)果,圖6顯示的就是這種模式,在這種模式下,可以通過前邊的紅色箭頭小按鈕進(jìn)入另外一種模式,該標(biāo)記的具體的所在處,也可以通過標(biāo)記的具體所在處點(diǎn)擊紅色箭頭小按鈕進(jìn)入警種模式,還可以通過工具條上的兩個(gè)紅色小箭頭直接在第二種模式下前后移動(dòng),察看相應(yīng)信息。它的這個(gè)強(qiáng)大的功能使得閱讀Linux源程序有如神助。但是要注意的是,當(dāng)進(jìn)行了第二次“Reference”時(shí),它會(huì)提示你將結(jié)果集附加在第一個(gè)結(jié)果集的后邊還是取代第一個(gè)結(jié)果集。如果選擇前者,不能對(duì)結(jié)果集根據(jù)前后兩次搜索結(jié)果進(jìn)行分類,然后在其子類里進(jìn)行移動(dòng),只能在整個(gè)結(jié)果集里移動(dòng);如果,選擇后者,結(jié)果集將會(huì)被替換為第二次搜索的結(jié)果,略微有些不方便。

          圖6 Reference的搜索結(jié)果

                                                                              Source Insight設(shè)置

          1、背景色選擇
              要改變背景色Options->preference->windows background->color設(shè)置背景色


          2、解決字符等寬對(duì)齊問題。
              SIS默認(rèn)字體是VERDANA,很漂亮。這網(wǎng)頁上應(yīng)該也是用的VERDANA字體。但由于美觀的緣故,VERDANA字體是不等寬的。比如下面兩行
              llllllllll
              MMMMMMMMMM
              同樣10個(gè)字符,長度差多了.用VERDANA來看程序,有些本應(yīng)該對(duì)齊的就歪了。解放方法是使用等寬的字體,但肯定比較丑。比較推薦的是用Courier New。

          3、解決TAB鍵縮進(jìn)問題
              Options-> Document Options里面的右下角Editing Options欄里,把Expand tabs勾起來,然后確定。OK,現(xiàn)在TAB鍵的縮進(jìn)和四個(gè)空格的縮進(jìn)在SIS里面看起來就對(duì)齊咯


          4、SI中的自動(dòng)對(duì)齊設(shè)置:
              在C程序里, 如果遇到行末沒有分號(hào)的語句,如IF, WHILE, SWITCH等, 寫到該行末按回車,則新行自動(dòng)相對(duì)上一行縮進(jìn)兩列。
              Option->Document option下的Auto Indient中Auto Indient Type有三種類型 None,Simple,Smart。個(gè)人推薦選用Simple類型。

          5、向項(xiàng)目中添加文件時(shí),只添加特定類型的文件(文件類型過濾器)
              編輯匯編代碼時(shí),在SIS里建立PROJECT并ADD TREE的時(shí)候,根據(jù)默認(rèn)設(shè)置并不會(huì)把該TREE里面所有匯編文件都包含進(jìn)來
              只加了.inc和.asm后綴的,.s后綴的沒有。而且用SIS打開.s的文件,一片黑白沒有色彩,感覺回到DOS的EDIT時(shí)代了……
              解決方法是在Options->Document Options里面,點(diǎn)左上的Document Type下拉菜單,選擇x86 Asm Source File,
              然后在右邊的File filter里*.asm;*.inc;的后面加上*.s;接著CLOSE就可以了。
              上面問題解決了,但注意加入*.s后還需要重新ADD TREE一遍才能把這些匯編加到PROJECT里面。

          6、添加文件類型
              用戶可以定義自己的類型,Options->Document Options->add type,定義文件類型名以及文件名后綴。
              勾選include when adding to projects在添加目錄下文件到工程是該類文件就會(huì)添加進(jìn)SI的工程。
              如果需要將所有文件添加進(jìn)SI的工程,可以定義一種文件類型*.*。   

          7、恢復(fù)ctrl+a的全選功能
              通過關(guān)鍵詞save 找到save all,更改為ctrl+shift+a,通過關(guān)鍵詞select找到select all,更改為ctrl +a


          Source Insight常用的快捷鍵:
              Ctrl+= :Jump to definition
              Alt+/ :Look up reference
              F3 : search backward
              F4 : search forward
              F5: go to Line
              F7 :Look up symbols
              F8 :Look up local symbols
              F9 :Ident left
              F10 :Ident right
              Alt+, :Jump backword
              Alt+. : Jump forward
              Shift+F3 : search the word under cusor backward
              Shift+F4 : search the word under cusor forward
              F12 : incremental search
              Shift+Ctrl+f: search in project
              shift+F8 : hilight word
             
          Source Insight的窗口操作:
              project window Ctrl+O打開
              symbol window Alt+F8打開和關(guān)閉
              Contex Window 自定義鍵打開和關(guān)閉
              Relation Window 自定義鍵打開 先鎖定再刷新聯(lián)系

          在Source Insight中添加自定義功能的步驟如下:
          1.Source Insight中,Options->Custom Commands...->Add...,New Command name 隨便寫,我的是"Edit with Vim"
          2.Run中寫入: "C:\Program Files\Vim\vim63\gvim.exe" --remote-silent +%l %f
          意思是在當(dāng)前已經(jīng)打開的gvim窗口里面打開當(dāng)前的文件,并且跳轉(zhuǎn)到指定行
          %l為當(dāng)前的行號(hào),%f為文件名
          使用 --remote-silent 的作用是,如果已經(jīng)打開了對(duì)應(yīng)文件,就不會(huì)打開第二次,而是在已經(jīng)打開的文件里跳轉(zhuǎn)到對(duì)應(yīng)行
          3.還是同一個(gè)對(duì)話框里面,選擇Keys->Assign New Key...->按F12,如果你已經(jīng)將F12設(shè)置給其他命令,選擇其他的按鍵就行了

          下面是一些常用自定義功能:( CUSTOM COMMANDS )
          打開資源管理器并選中當(dāng)前文件
          ShellExecute open explorer /e,/select,%f
          查看log
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:log /path:%f /notempfile /closeonend
          diff
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:diff /path:%f /notempfile /closeonend
          取得鎖定(check out)
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:lock /path:%f /notempfile /closeonend
          提交(check in)
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:commit /path:%f /notempfile /closeonend
          更新(update)
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:%f /notempfile /closeonend
          更新整個(gè)目錄(update all)
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:*.* /notempfile /closeonend
          取消鎖定(undo check out)
          "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:revert /path:%f /notempfile /closeonend
          在ultriEdit中編輯
          "C:\Program Files\UltraEdit-32/uedit32" %f
          在vim中編輯并定位到當(dāng)前行
          "C:\Program Files\Vim\vim63\gvim.exe" --remote-silent +%l %f

          匯總其他小技巧:
          讓{ 和 } 不縮進(jìn):
          Options->Document Options->Auto Indent->Indent Open Brace/Indent Close Brace
          hao space: SourceInsight 小技巧
          1、按住"ctrl", 再用鼠標(biāo)指向某個(gè)變量,點(diǎn)擊一下,就能進(jìn)入這個(gè)變量的定義。

          2、今天把一個(gè)用sourceinsight排版整齊的C文件,偶然用VC打開一看,全亂了。研究了半天,發(fā)現(xiàn)SI對(duì)每個(gè)字符的寬度不太一致。
              請(qǐng)教同事發(fā)現(xiàn)選上"view --> draft view", 就可以讓每個(gè)字符的寬度一致了。快捷鍵是 "Alt + F12"

          3、"shift+F8" 標(biāo)亮所有文本中光標(biāo)所在位置的單詞

          4、跳到某一行:"ctrl + g"


          Source Insight是閱讀和編寫代碼的好東東,基本上也算得上是經(jīng)典之作了,雖然還有一點(diǎn)點(diǎn)小bug,不過對(duì)于我們這些C程序員來說可是一旦擁有別無所求。下 列小技巧是在工作中同事整理總結(jié)的,對(duì)提高工作效率多少有點(diǎn)幫助,其中有些是對(duì)應(yīng)于SVN的,沒有使用SVN做版本管理的人就不要白費(fèi)力氣了。

          ShellExecute open explorer /e,/select,%f
                  /*作用是在資源管理器中打開當(dāng)前編輯文件并選中*/
                  /*可以設(shè)置快捷鍵如ctrl+e,這樣能很方便的在資源管理器打開對(duì)應(yīng)的文件,并進(jìn)行tortoiseSVN的相關(guān)操作*/

          X:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:log /path:% /notempfile /closeonend
                  /*使用前注意更改對(duì)應(yīng)的bin安裝路徑*/
                  /*作用是直接查看當(dāng)前文件的svn log*/
                  /*可以設(shè)置快捷鍵如ctrl+l*/

          X:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:diff /path:% /notempfile /closeonend
                  /*使用前注意更改對(duì)應(yīng)的bin安裝路徑*/
                  /*作用是直接查看當(dāng)前文件和基準(zhǔn)版本的比較*/
                  /*可以設(shè)置快捷鍵如ctrl+d*/


          posted @ 2012-07-13 14:56 姚先進(jìn) 閱讀(455) | 評(píng)論 (0)編輯 收藏
           
          一般用于將C++代碼以標(biāo)準(zhǔn)C形式輸出(即以C的形式被調(diào)用),這是因?yàn)镃++雖然常被認(rèn)為是C的超集,但是C++的編譯器還是與C的編譯器不同的。C中調(diào)用C++中的代碼這樣定義會(huì)是安全的。
          一般的考慮跨平臺(tái)使用方法如下:
          #ifdefined(__cplusplus)||defined(c_plusplus) //跨平臺(tái)定義方法
          extern "C"{
          #endif
          //... 正常的聲明段
          #ifdefined(__cplusplus)||defined(c_plusplus)
          }
          #endif 
          
          簡單的用在windows下可以如下定義:
          #ifdef   __cplusplus
          extern "C"{
          //... 正常的聲明段
          }
          #endif
          posted @ 2012-07-12 16:05 姚先進(jìn) 閱讀(191) | 評(píng)論 (0)編輯 收藏
           

          1. 信號(hào)概念
          信號(hào)是進(jìn)程在運(yùn)行過程中,由自身產(chǎn)生或由進(jìn)程外部發(fā)過來的消息(事件)。信號(hào)是硬件中斷的軟件模擬(軟中斷)。每個(gè)信號(hào)用一個(gè)整型常量宏表示,以SIG開頭,比如SIGCHLD、SIGINT等,它們?cè)谙到y(tǒng)頭文件中定義,也可以通過在shell下鍵入kill –l查看信號(hào)列表,或者鍵入man 7 signal查看更詳細(xì)的說明。
          信號(hào)的生成來自內(nèi)核,讓內(nèi)核生成信號(hào)的請(qǐng)求來自3個(gè)地方:
          l         用戶:用戶能夠通過輸入CTRL+c、Ctrl+,或者是終端驅(qū)動(dòng)程序分配給信號(hào)控制字符的其他任何鍵來請(qǐng)求內(nèi)核產(chǎn)生信號(hào);
          l         內(nèi)核:當(dāng)進(jìn)程執(zhí)行出錯(cuò)時(shí),內(nèi)核會(huì)給進(jìn)程發(fā)送一個(gè)信號(hào),例如非法段存取(內(nèi)存訪問違規(guī))、浮點(diǎn)數(shù)溢出等;
          l         進(jìn)程:一個(gè)進(jìn)程可以通過系統(tǒng)調(diào)用kill給另一個(gè)進(jìn)程發(fā)送信號(hào),一個(gè)進(jìn)程可以通過信號(hào)和另外一個(gè)進(jìn)程進(jìn)行通信。
          由進(jìn)程的某個(gè)操作產(chǎn)生的信號(hào)稱為同步信號(hào)(synchronous signals),例如除0;由象用戶擊鍵這樣的進(jìn)程外部事件產(chǎn)生的信號(hào)叫做異步信號(hào)。(asynchronous signals)。
                 進(jìn)程接收到信號(hào)以后,可以有如下3種選擇進(jìn)行處理:
          l         接收默認(rèn)處理:接收默認(rèn)處理的進(jìn)程通常會(huì)導(dǎo)致進(jìn)程本身消亡。例如連接到終端的進(jìn)程,用戶按下CTRL+c,將導(dǎo)致內(nèi)核向進(jìn)程發(fā)送一個(gè)SIGINT的信號(hào),進(jìn)程如果不對(duì)該信號(hào)做特殊的處理,系統(tǒng)將采用默認(rèn)的方式處理該信號(hào),即終止進(jìn)程的執(zhí)行;
          l         忽略信號(hào):進(jìn)程可以通過代碼,顯示地忽略某個(gè)信號(hào)的處理,例如:signal(SIGINT,SIGDEF);但是某些信號(hào)是不能被忽略的,
          l         捕捉信號(hào)并處理:進(jìn)程可以事先注冊(cè)信號(hào)處理函數(shù),當(dāng)接收到信號(hào)時(shí),由信號(hào)處理函數(shù)自動(dòng)捕捉并且處理信號(hào)。
           
          有兩個(gè)信號(hào)既不能被忽略也不能被捕捉,它們是SIGKILL和SIGSTOP。即進(jìn)程接收到這兩個(gè)信號(hào)后,只能接受系統(tǒng)的默認(rèn)處理,即終止線程。
          2. signal信號(hào)處理機(jī)制
          可以用函數(shù)signal注冊(cè)一個(gè)信號(hào)捕捉函數(shù)。原型為:
          #include
          typedef void (*sighandler_t)(int);
          sighandler_t signal(int signum, sighandler_t handler);
           
          signal 的第1個(gè)參數(shù)signum表示要捕捉的信號(hào),第2個(gè)參數(shù)是個(gè)函數(shù)指針,表示要對(duì)該信號(hào)進(jìn)行捕捉的函數(shù),該參數(shù)也可以是SIG_DEF(表示交由系統(tǒng)缺省處理,相當(dāng)于白注冊(cè)了)或SIG_IGN(表示忽略掉該信號(hào)而不做任何處理)。signal如果調(diào)用成功,返回以前該信號(hào)的處理函數(shù)的地址,否則返回 SIG_ERR。
          sighandler_t是信號(hào)捕捉函數(shù),由signal函數(shù)注冊(cè),注冊(cè)以后,在整個(gè)進(jìn)程運(yùn)行過程中均有效,并且對(duì)不同的信號(hào)可以注冊(cè)同一個(gè)信號(hào)捕捉函數(shù)。該函數(shù)只有一個(gè)參數(shù),表示信號(hào)值。
          示例:
          1、  捕捉終端CTRL+c產(chǎn)生的SIGINT信號(hào):
          #include
          #include
          #include
          #include
           
          void SignHandler(int iSignNo)
          {
              printf("Capture sign no:%d ",iSignNo);
          }
           
          int main()
          {
              signal(SIGINT,SignHandler);
              while(true)
                  sleep(1);
              return 0;
          }
          該程序運(yùn)行起來以后,通過按 CTRL+c將不再終止程序的運(yùn)行。應(yīng)為CTRL+c產(chǎn)生的SIGINT信號(hào)已經(jīng)由進(jìn)程中注冊(cè)的SignHandler函數(shù)捕捉了。該程序可以通過 Ctrl+終止,因?yàn)榻M合鍵Ctrl+能夠產(chǎn)生SIGQUIT信號(hào),而該信號(hào)的捕捉函數(shù)尚未在程序中注冊(cè)。
          2、  忽略掉終端CTRL+c產(chǎn)生的SIGINT信號(hào):
          #include
          #include
          #include
          #include
           
          int main()
          {
              signal(SIGINT,SIG_IGN);
              while(true)
                  sleep(1);
              return 0;
          }
          該程序運(yùn)行起來以后,將CTRL+C產(chǎn)生的SIGINT信號(hào)忽略掉了,所以CTRL+C將不再能是該進(jìn)程終止,要終止該進(jìn)程,可以向進(jìn)程發(fā)送SIGQUIT信號(hào),即組合鍵CTRL+
           
          3、  接受信號(hào)的默認(rèn)處理,接受默認(rèn)處理就相當(dāng)于沒有寫信號(hào)處理程序:
           
          #include
          #include
          #include
          #include
           
          int main()
          {
              signal(SIGINT,DEF);
              while(true)
                  sleep(1);
              return 0;
          }
          3. sigaction信號(hào)處理機(jī)制
          3.1. 信號(hào)處理情況分析
          在signal處理機(jī)制下,還有許多特殊情況需要考慮:
          1、  冊(cè)一個(gè)信號(hào)處理函數(shù),并且處理完畢一個(gè)信號(hào)之后,是否需要重新注冊(cè),才能夠捕捉下一個(gè)信號(hào);
          2、  如果信號(hào)處理函數(shù)正在處理信號(hào),并且還沒有處理完畢時(shí),又發(fā)生了一個(gè)同類型的信號(hào),這時(shí)該怎么處理;
          3、  如果信號(hào)處理函數(shù)正在處理信號(hào),并且還沒有處理完畢時(shí),又發(fā)生了一個(gè)不同類型的信號(hào),這時(shí)該怎么處理;
          4、  如果程序阻塞在一個(gè)系統(tǒng)調(diào)用(如read(...))時(shí),發(fā)生了一個(gè)信號(hào),這時(shí)是讓系統(tǒng)調(diào)用返回錯(cuò)誤再接著進(jìn)入信號(hào)處理函數(shù),還是先跳轉(zhuǎn)到信號(hào)處理函數(shù),等信號(hào)處理完畢后,系統(tǒng)調(diào)用再返回。
           
          示例:
          #include
          #include
          #include
          #include
           
          int g_iSeq=0;
           
          void SignHandler(int iSignNo)
          {
              int iSeq=g_iSeq++;
              printf("%d Enter SignHandler,signo:%d. ",iSeq,iSignNo);
              sleep(3);
              printf("%d Leave SignHandler,signo:%d ",iSeq,iSignNo);
          }
           
          int main()
          {
              char szBuf[8];
              int iRet;
              signal(SIGINT,SignHandler);
              signal(SIGQUIT,SignHandler);
              do{
                  iRet=read(STDIN_FILENO,szBuf,sizeof(szBuf)-1);
                  if(iRet<0){
                      perror("read fail.");
                      break;
                  }
                szBuf[iRet]=0;
                  printf("Get: %s",szBuf);
              }while(strcmp(szBuf,"quit ")!=0);
              return 0;
          }
          程序運(yùn)行時(shí),針對(duì)于如下幾種輸入情況(要輸入得快),看輸出結(jié)果:
          1、  CTRL+c] [CTRL+c] [CTRL+c]
          2、  [CTRL+c] [CTRL+]
          3、  hello [CTRL+] [Enter]
          4、  [CTRL+] hello [Enter]
          5、  hel [CTRL+] lo[Enter]
           
          針對(duì)于上面各種情況,不同版本OS可能有不同的響應(yīng)結(jié)果。
          3.2. sigaction信號(hào)處理注冊(cè)
          如果要想用程序控制上述各種情況的響應(yīng)結(jié)果,就必須采用新的信號(hào)捕獲機(jī)制,即使用sigaction信號(hào)處理機(jī)制。
          函數(shù)原型:
          #include
          int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
          sigaction也用于注冊(cè)一個(gè)信號(hào)處理函數(shù)。
          參數(shù)signum為需要捕捉的信號(hào);
          參數(shù) act是一個(gè)結(jié)構(gòu)體,里面包含信號(hào)處理函數(shù)地址、處理方式等信息。
          參數(shù)oldact是一個(gè)傳出參數(shù),sigaction函數(shù)調(diào)用成功后,oldact里面包含以前對(duì)signum的處理方式的信息。
          如果函數(shù)調(diào)用成功,將返回0,否則返回-1
          結(jié)構(gòu)體 struct sigaction(注意名稱與函數(shù)sigaction相同)的原型為:
          struct sigaction {
              void (*sa_handler)(int);         // 老類型的信號(hào)處理函數(shù)指針
          void (*sa_sigaction)(int, siginfo_t *, void *);//新類型的信號(hào)處理函數(shù)指針
          sigset_t sa_mask;                 // 將要被阻塞的信號(hào)集合
          int sa_flags;                         // 信號(hào)處理方式掩碼
          void (*sa_restorer)(void);     // 保留,不要使用。
          }
                 該結(jié)構(gòu)體的各字段含義及使用方式:
          1、字段sa_handler是一個(gè)函數(shù)指針,用于指向原型為void handler(int)的信號(hào)處理函數(shù)地址,       即老類型       的信號(hào)處理函數(shù);
          2、字段sa_sigaction也是一個(gè)函數(shù)指針,用于指向原型為:
          void handler(int iSignNum,siginfo_t *pSignInfo,void *pReserved);
          的信號(hào)處理函數(shù),即新類型的信號(hào)處理函數(shù)。
          該函數(shù)的三個(gè)參數(shù)含義為:
                        iSignNum :傳入的信號(hào)
                        pSignInfo :與該信號(hào)相關(guān)的一些信息,它是個(gè)結(jié)構(gòu)體
                        pReserved :保留,現(xiàn)沒用
          3、字段sa_handler和sa_sigaction只應(yīng)該有一個(gè)生效,如果想采用老的信號(hào)處理機(jī)制,就應(yīng)該讓sa_handler指向正確的信號(hào)處理函數(shù);否則應(yīng)該讓sa_sigaction指向正確的信號(hào)處理函數(shù),并且讓字段 sa_flags包含SA_SIGINFO選項(xiàng)。
          4、字段sa_mask是一個(gè)包含信號(hào)集合的結(jié)構(gòu)體,該結(jié)構(gòu)體內(nèi)的信號(hào)表示在進(jìn)行信號(hào)處理時(shí),將要被阻塞的信號(hào)。針對(duì)sigset_t結(jié)構(gòu)體,有一組專門的函數(shù)對(duì)它進(jìn)行處理,它們是:
                        #include
                  int sigemptyset(sigset_t *set);                                   // 清空信號(hào)集合set
                  int sigfillset(sigset_t *set);                                 // 將所有信號(hào)填充進(jìn)set中
                  int sigaddset(sigset_t *set, int signum);               // 往set中添加信號(hào)signum
                  int sigdelset(sigset_t *set, int signum);                // 從set中移除信號(hào)signum
                  int sigismember(const sigset_t *set, int signum); // 判斷signnum是不是包含在set中
                 例如,如果打算在處理信號(hào)SIGINT時(shí),只阻塞對(duì)SIGQUIT信號(hào)的處理,可以用如下種方法:
                        struct sigaction act;
                        sigemptyset(&act.sa_mask);
                        sigaddset(&act_sa_mask,SIGQUIT);
                        sigaction(SIGINT,&act,NULL);
          5、  字段sa_flags是一組掩碼的合成值,指示信號(hào)處理時(shí)所應(yīng)該采取的一些行為,各掩碼的含義為:
           
          掩碼 描述
          SA_RESETHAND 處理完畢要捕捉的信號(hào)后,將自動(dòng)撤消信號(hào)處理函數(shù)的注冊(cè),即必須再重新注冊(cè)信號(hào)處理函數(shù),才能繼續(xù)處理接下來產(chǎn)生的信號(hào)。該選項(xiàng)不符合一般的信號(hào)處理流程,現(xiàn)已經(jīng)被廢棄。
          SA_NODEFER 在處理信號(hào)時(shí),如果又發(fā)生了其它的信號(hào),則立即進(jìn)入其它信號(hào)的處理,等其它信號(hào)處理完畢后,再繼續(xù)處理當(dāng)前的信號(hào),即遞規(guī)地處理。如果sa_flags包含了該掩碼,則結(jié)構(gòu)體sigaction的sa_mask將無效!
          SA_RESTART 如果在發(fā)生信號(hào)時(shí),程序正阻塞在某個(gè)系統(tǒng)調(diào)用,例如調(diào)用read()函數(shù),則在處理完畢信號(hào)后,接著從阻塞的系統(tǒng)返回。該掩碼符合普通的程序處理流程,所以一般來說,應(yīng)該設(shè)置該掩碼,否則信號(hào)處理完后,阻塞的系統(tǒng)調(diào)用將會(huì)返回失敗!
          SA_SIGINFO 指示結(jié)構(gòu)體的信號(hào)處理函數(shù)指針是哪個(gè)有效,如果sa_flags包含該掩碼,則sa_sigactiion指針有效,否則是sa_handler指針有效。

          posted @ 2012-07-12 15:59 姚先進(jìn) 閱讀(184) | 評(píng)論 (0)編輯 收藏
           
          我的混亂

          1.。。可執(zhí)行cgi文件在超級(jí)終端可以運(yùn)行,但是用瀏覽器訪問服務(wù)器時(shí) 前后出現(xiàn)了莫名其妙的亂碼錯(cuò)誤  

          2.。。表單以action=http://192.168.1.230/cgi-bin/...cgi 提交之后不能運(yùn)行 ...cgi  但是直接在網(wǎng)

          址中輸入http://192.168.1.230/cgi-bin/...cgi 可以運(yùn)行 (依然是亂碼匆匆)(兩種連接的地址欄中

          是一樣的地址)


          3.。。為什么別人的可以順利運(yùn)行我的不行
           

                            I HATE IT !!!




          posted @ 2012-04-19 22:03 姚先進(jìn) 閱讀(175) | 評(píng)論 (0)編輯 收藏
           

          首先聲明 :這是我借鑒別人聯(lián)合自己的交叉編譯經(jīng)驗(yàn)做改動(dòng)而來的

              1。# tar zxvf sqlite-3.3.7.tar.gz

          #cd /usr/local/arm-linux/sqlite-3.3.7

          新建一個(gè)sqlite-arm-linux目錄

              2.# mkdir /usr/local/arm-linux/sqlite-arm-linux

              3.# cd /usr/local/arm-linux/sqlite-arm-linux

              # export PATH=/usr/local/arm-linux/bin:$PATH


              4.#../sqlite-3.3.7/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux

          這部會(huì)出現(xiàn)下面的錯(cuò)誤:


          configure: error: unable to find a compiler for building build tools


          這個(gè)錯(cuò)誤的解決方法是:


          首先,我們進(jìn)入目錄usr/local/arm-linux/sqlite-1.3.7,打開其中的configure文件,用查找功能找到下列語句:

              (用 test "$cross_compiling" = yes &&進(jìn)行搜索)
          # test "$cross_compiling" = yes &&

          # { { echo "$as_me:13264: error: cannot check for file existence when cross compiling" >&5

          #echo "$as_me: error: cannot check for file existence when cross compiling" >&2;}

          # { (exit 1); exit 1; }; }

          把其中的{ (exit 1); exit 1; }; }改為 { (echo 1); echo 1; }; }

          一共有兩處,都改過來。


          然后,我們要設(shè)置config_TARGET_CC和config_BUILD_CC兩個(gè)環(huán)境變量。config_TARGET_CC是交叉編譯器,config_BUILD_CC是主機(jī)編譯器。重來:

          #export config_BUILD_CC=gcc

          #export config_TARGET_CC=arm-linux-gcc

          下面重新編譯就可以了

          #../sqlite-3.3.7/configure --host=arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux

          然后我們會(huì)發(fā)現(xiàn)在在/usr/local/arm-linux/sqlite-arm-linux目錄下生成一些相關(guān)文件: config.log config.status libtool Makefile sqlite3.pc

           如果:還是出現(xiàn)如下同樣的錯(cuò)誤
          checking for /usr/include/readline.h... configure: error: cannot check for file existence when cross compiling

            那么 首先 : 你檢查你的交叉編譯環(huán)境 錯(cuò)誤?? 如果真的沒有則安裝readline.h 在ubuntu的軟件中心查找libncurses5-dev libreadline5-dev進(jìn)行安裝

                  如果安裝之后從新。/conigure還是有這個(gè)錯(cuò)誤 那就不管了 我不知道了但是還是生成了makefile文件!


          下面在make之前我們修改一下Makefile文件,把其中的BCC = arm-linux-gcc -g -O2 為 BCC = gcc -g -O2
          #make

          #make install

          會(huì)出現(xiàn)這樣的話語:libsqlite3.so.0.8.6: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped

                  over !!!

           

          posted @ 2012-04-18 09:37 姚先進(jìn) 閱讀(1991) | 評(píng)論 (0)編輯 收藏
           
           本人ubuntu又連上了網(wǎng)
           說明: 開始 為了讓虛擬機(jī)中得ubuntu能用串口連接上ARM 板,本人對(duì)虛擬機(jī)添加串口,設(shè)為自動(dòng)使用物理機(jī)串口,設(shè)置完后vm提示沒有多余的串口之類的,接著ubuntu就不能聯(lián)網(wǎng)了,
                  后來,把添加的串口刪除掉仍然不能上網(wǎng),
                  最后 折騰很久vm中得fedora可以上但ubuntu就是不能上 ,
                  沒辦法 把vm重裝了一遍 ,然后
              1.vm中vm-》setting -》network adapter-》nat
              2.vm中edit-》virturenetworkeditor把vmnet0設(shè)置為host only  并且勾選最下方的兩個(gè) 確定
                        同時(shí)把 vmnet8 設(shè)置成nat同時(shí)勾選最下方的兩列 確認(rèn) 
              3.打開ubunu     ifconfig 可見  

          eth0      Link encap:Ethernet  HWaddr 00:0c:29:05:48:93 
                    inet addr:192.168.188.128  Bcast:192.168.188.255  Mask:255.255.255.0
                    inet6 addr: fe80::20c:29ff:fe05:4893/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:18 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:69 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:1000
                    RX bytes:2134 (2.1 KB)  TX bytes:10542 (10.5 KB)
                    Interrupt:19 Base address:0x2024

          lo        Link encap:Local Loopback 
                    inet addr:127.0.0.1  Mask:255.0.0.0
                    inet6 addr: ::1/128 Scope:Host
                    UP LOOPBACK RUNNING  MTU:16436  Metric:1
                    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:0
                    RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

           
          聯(lián)網(wǎng)成功
            由上可見etho聯(lián)網(wǎng)成功 
              但是lo并沒有 在、etc/network/interfaces 里面可見
              auto lo
              iface lo inet loopback 
               原來  lo是本地回環(huán)地址   在ping127.0.0.1 時(shí)被使用到

          posted @ 2012-04-18 08:54 姚先進(jìn) 閱讀(861) | 評(píng)論 (1)編輯 收藏
          僅列出標(biāo)題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 句容市| 江都市| 冕宁县| 隆昌县| 盘锦市| 凌源市| 太仆寺旗| 肥东县| 崇文区| 桦川县| 常宁市| 彭州市| 虎林市| 海原县| 厦门市| 万源市| 剑川县| 高雄县| 元朗区| 乐亭县| 沿河| 康马县| 芒康县| 确山县| 缙云县| 多伦县| 威远县| 庄河市| 大关县| 长泰县| 木里| 富阳市| 巴青县| 来安县| 得荣县| 景泰县| 霞浦县| 吉首市| 米脂县| 沿河| 银川市|