• C/C++网络编程7——多进程服务器端之fork函数


      通过前面几节的内容,我们已经可以实现基本的C/S结构的程序了,但是当多个客户端同时向服务器端请求服务时,服务器端只能按顺序一个一个的服务,这种情况下,客户端的用户是无法忍受的。所以虚实现并发的服务器端。

    并发服务器端的实现方法:

      1:多进程服务器端:通过创建多个进程提供服务。

      2:多路复用服务器:用过捆绑并统一管理I/O对象提供服务。

      3:多线程服务器:通过生成与客户端等量的线程提供服务。

    多进程服务器端:

      进程:可执行程序的一次执行过程。

      在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;
    }

    僵尸进程及孤儿进程:

      僵尸进程:子线程执行结束以后,系统资源不会被操作系统回收,需等父进程执行结束时回收,但父进程没执行结束,此时的子进程就成了僵尸进程。

      孤儿进程:父进程已经执行结束,子进程还没执行结束,这时的子进程成为孤儿进程。孤儿进程执行结束以后系统资源有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;
    }

     

  • 相关阅读:
    js全局变量
    $.getJSON异步请求和同步请求
    让js中的函数只有一次有效调用
    两个div并排显示,当浏览器界面缩小时会出现换行
    jquery获取窗口和文档的高度和宽度
    后台传带引号(")的数据需要注意
    C# dynamic
    (转)数据库函数解析JSON字符串
    Unicode和UTF-8
    用户通过浏览器修改表单隐藏域
  • 原文地址:https://www.cnblogs.com/418ks/p/11717113.html
Copyright © 2020-2023  润新知