C++:Scoket編程中的fork函數

 

  如果你熟悉基本的C/S結構,就會知道:當多個客戶端同時向服務器端請求服務時,服務器端只能按順序一個一個的服務,這種情況下,客戶端的用戶是無法忍受的。所以需實現併發的服務器端。

併發服務器端的實現方法:

  1:多進程服務器端:通過創建多個進程提供服務。

  2:多路複用服務器:用過捆綁並統一管理I/O對象提供服務。

  3:多線程服務器:通過生成與客戶端等量的線程提供服務。

 

1.多進程服務器端:

  進程:可執行程序的一次執行過程。

  在linux下可通過fork()函數創建一個進程。

#include <unistd.h>

pid_t fork(void)
// 成功返回時父進程返回子進程的id,子進程返回0,失敗時返回-1

  通過fork()函數創建進程以後,父進程和子進程擁有完全獨立的內存空間。舉例:

#include <iostream>
#include <unistd.h>

using namespace std;

int g_count = 10;

int main()
{
    int l_count = 20;
    g_count++;
    l_count++;

    pid_t pid = fork();

    if (pid < 0) {
        cout << "fork() failed" << endl;
        return 0;
    }

    if (pid == 0) {
        g_count += 5;
        l_count += 5;
    } else {
        g_count -= 5;
        l_count -= 5;
    }

    if (pid == 0) {
        cout << "child: " << g_count <<" " << l_count << endl;
    } else {
        cout << "parent: " << g_count <<" " << l_count << endl;
    }

    return 0;
}

結果截圖:

 

2.殭屍進程及孤兒進程:

  殭屍進程:子線程執行結束以後,系統資源不會被操作系統回收,需等父進程執行結束時回收,但父進程沒執行結束,此時的子進程就成了殭屍進程。

  孤兒進程:父進程已經執行結束,子進程還沒執行結束,這時的子進程成爲孤兒進程。孤兒進程執行結束以後系統資源有pid=1的進程回收。

  殭屍進程的系統資源遲遲得不到回收會導致系統資源被耗盡,所以需要避免殭屍進程。孤兒進程不會造成資源不被回收,可不處理。

  殭屍進程產生舉例:

#include <iostream>
#include <unistd.h>

using namespace std;

int main()
{
    pid_t pid = fork();

    if (pid < 0) {
        cout << "fork() failed" << endl;
        return 0;
    }

    if (pid == 0) {
        cout << "i am child proc: " << getpid() << endl;
    } else {
        cout << "i am parent proc: " << getpid() << endl;
        sleep(60);
    }

    return 0;
}


結果截圖:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章