Socket編程--TCP服務端注意事項

  • 殭屍進程處理
    •   殭屍進程和孤兒進程
      •   基本概念:咱們知道在unix/linux中,正常狀況下,子進程是經過父進程建立的,子進程在建立新的進程。子進程的結束和父進程的運行是一個異步過程,即父進程永遠沒法預測子進程 到底何時結束。 當一個 進程完成它的工做終止以後,它的父進程須要調用wait()或者waitpid()系統調用取得子進程的終止狀態。(大致就是父進程必須去獲得子進程的結束信息,若是沒有獲得的就是殭屍,死了還在系統中,父進程不知道。)
      •   孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被init進程(進程號爲1)所收養,並由init進程對它們完成狀態收集工做。
      •   殭屍進程:一個進程使用fork建立子進程,若是子進程退出,而父進程並無調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之爲僵死進程。
      •   孤兒進程和殭屍進程的危害:
        •   孤兒:孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了init進程身上,init進程就好像是一個民政局,專門負責處理孤兒進程的善後工做。每當出現一個孤兒進程的時候,內核就把孤 兒進程的父進程設置爲init,而init進程會循環地wait()它的已經退出的子進程。這樣,當一個孤兒進程淒涼地結束了其生命週期的時候,init進程就會表明黨和政府出面處理它的一切善後工做。所以孤兒進程並不會有什麼危害。
        •   殭屍:若是大量產生殭屍進程(殭屍進程的進程號以及一些其餘的東西會保留下來),那麼就會使得系統中的進程號被太多的佔去,就沒有辦法產生新的進程了,因此殭屍應當避免。
        • 更詳細的內容請參考:http://www.cnblogs.com/Anker/p/3271773.html


    •   處理方法
      •   ①:經過忽略SIGCHLD信號,避免殭屍進程
        在server端代碼中添加
        signal(SIGCHLD, SIG_IGN);
        SIG_IGN:這個是忽略信號

        SIGCHLD,在一個進程終止或者中止時,將SIGCHLD信號發送給其父進程,按系統默認將忽略此信號,若是父進程但願被告知其子系統的這種狀態,則應捕捉此信號。
        signal()函數理解,在<signal.h> 這個頭文件中。

        signal(參數1,參數2);html

        參數1:咱們要進行處理的信號。linux

        參數2:咱們處理的方式(是系統默認仍是忽略仍是捕獲)。SIG_IGN,SIG_DFL,異步

         
      •   ②:經過wait/waitpid方法,解決殭屍進
        signal(SIGCHLD,onSignalCatch);  
        
        onSignalCatch:若是父進程但願被告知其子系統的這種狀態,則應捕捉此信號,這個是捕捉信號
        void onSignalCatch(int signalNumber) {  wait(NULL); }
  • TCP協議的11中狀態
    •   
    •   詳細信息參考:http://www.cnblogs.com/Kobe10/p/5770585.html



  • close和shutdown 的區別
    •   當全部的數據操做結束之後,你能夠調用close()函數來釋放該socket,從而中止在該socket上的任何數據操做:
      close(sockfd);
    •   你也能夠調用shutdown()函數來關閉該socket。該函數容許你只中止在某個方向上的數據傳輸,而一個方向上的數據傳輸繼續進行。如你能夠關 閉某socket的寫操做而容許繼續在該socket上接受數據,直至讀入全部數據。
      • 使用close停止一 個鏈接,但它只是減小描述符的參考數,並不直接關閉鏈接,只有當描述符的參考數爲0時才關閉鏈接。
        shutdown可直接關閉描述符,不考慮描述 符的參考數,可選擇停止一個方向的鏈接。


  • 完整的地址:http://blog.csdn.net/zjf280441589/article/details/44259777
相關文章
相關標籤/搜索