通过前面几节的内容,我们已经可以实现基本的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 < ) {
cout << "fork() failed" << endl;
return ;
} if (pid == ) {
cout << "i am child proc: " << getpid() << endl;
} else {
cout << "i am parent proc: " << getpid() << endl;
sleep();
} return ;
}

C/C++网络编程7——多进程服务器端之fork函数的更多相关文章

  1. C/C++网络编程9——多进程服务器端实现

    #include <iostream> #include <unistd.h> #include <cstdlib> #include <arpa/inet. ...

  2. C/C++网络编程8——多进程服务器端之销毁僵尸进程

    上一节提到,当子进程执行结束,父进程还在执行,在父进程结束之前子进程会成为僵尸进程,那么怎么销毁僵尸进程呢?父进程主动接收子进程的返回值. 销毁僵尸进程的方法: 1:使用wait函数 2:使用wait ...

  3. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  4. 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型

    进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...

  5. TCP/IP网络编程之多进程服务端(一)

    进程概念及应用 我们知道,监听套接字会有一个等待队列,里面存放着不同客户端的连接请求,如果有一百个客户端,每个客户端的请求处理是0.5s,第一个客户端当然不会不满,但第一百个客户端就会有相当大的意见了 ...

  6. 网络编程中的read,write函数

    关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...

  7. 网络编程readn、writen和readline函数的编写

    readn   在Linux中,read的声明为: ssize_t read(int fd, void *buf, size_t count); 它的返回值有以下情形: 1.大于0,代表成功读取的字节 ...

  8. UNIX网络编程读书笔记:地址操纵函数

    地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址. 1.inet_aton.inet_addr.inet_ntoa inet ...

  9. 深入浅出--UNIX多进程编程之fork()函数

    0前言 上周都在看都在学习unix环境高级编程的第八章--进程控制.也就是这一章中.让我理解了unix中一些进程的原理.以下我就主要依照进程中最重要的三个函数来进行解说.让大家通过阅读这一篇文章彻底明 ...

随机推荐

  1. next.config.js

    const configs = { // 编译文件的输出目录 distDir: 'dest', // 是否给每个路由生成Etag generateEtags: true, // 页面内容缓存配置 on ...

  2. Opencv -lippicv

    参考博客:https://blog.csdn.net/tmosk/article/details/76578082 参考博客:https://blog.csdn.net/kaka20080622/ar ...

  3. class实现React继承以及constructor的super的问题

    看这篇文章之前 建议先看看阮一峰 的Class继承 便于更好的理解 首先要知道一个问题 React的父子组件和组件类的继承有什么关系?答案是:没有关系 父子组件:指的得是组件标签包含关系 父子组件通过 ...

  4. Spring - Spring Boot - 应用构建与运行

    概述 spring boot 应用构建 spring boot 应用运行 背景 之前的看了看 Spring 的书, 结果老懒没实践 而且后续有别的想法, 但这个始终是第一步 1. 准备 知识 java ...

  5. 每天进步一点点------基础实验_12_有限状态机 :Moore型序列检测器

    /********************************************************************************* * Company : * Eng ...

  6. 搭建 VUE + NODE.JS + ElementUI 学习过程中问题总结

    1.exports 和 module.exports require 用来加载代码,而 exports 和 module.exports 则用来导出代码. module.exports 初始值为一个空 ...

  7. linux下删除文件夹

    ---恢复内容开始--- 4月份左右接触linux,一直到现在,收获不多,原因是因为我没有足够的努力,其实这段时间以来我也很自责. 今天学习linux进程调度等知识,使用小红帽时,准备删除一个无用的文 ...

  8. 洛谷 P1063 能量项链(区间DP)

    嗯... 题目链接:https://www.luogu.com.cn/problem/P1063 这道题首先要读懂题目,然后往上套区间dp,要转换成链式. AC代码: #include<cstd ...

  9. 「luogu3380」【模板】二逼平衡树(树套树)

    「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...

  10. Python基础(一) Python3环境搭建

    转载清注明原文地址,谢谢. OS:Windows 10 第一步,从Python官方下载安装包 Windows端下载地址:https://www.python.org/downloads/windows ...