通过前面几节的内容,我们已经可以实现基本的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. tf.train.examle函数

    在自定义数据集中: example = tf.train.Example(features=tf.train.Features(feature={ 'img_raw': tf.train.Featur ...

  2. AcWing 240. 食物链

    #include <iostream> using namespace std; ; int n, m; int p[N], d[N]; //p是baba,d是距离 int find(in ...

  3. Linux 下使用 ffmpeg 大批量合并 ts 文件, mp4切割文件为m3u8

    见范例 ffmpeg -i "concat:file001.ts|file002.ts|file003.ts|file004.ts......n.ts" -acodec copy ...

  4. C语言特点有哪些?

    C语言的特点 : 1.简洁紧凑.灵活方便 C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示.它把高级语言的基本结构和语句与低级语言的实用性结合起来. C 语言可以象汇编语言一 ...

  5. shell 参数与逻辑结构语句

    shell参数 如同ls 命令可以接受目录等作为它的参数一样,在shell编程时同样可以使用参数.Shell有位置参数和内部参数. 1. 位置参数 由系统提供的参数称为位置参数.位置参数的值可以用$N ...

  6. P&R 6

    Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? Floorplan基本 ...

  7. 使用Canvas画布的注意事项

    1.开始一个路径时要使用beiginPath()方法 ,不然会发生意想不到的事件. 2.图片加载完成后才能按照顺序依次绘图 (巧用onload时间)

  8. 攻防世界 xff_referer

    xff_referer [原理] X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项 HTTP R ...

  9. 安装和配置Windows系统虚拟机

    1.打开虚拟机软件,点击新建虚拟机. 2.选择典型配置,点击下一步. 3.点击安装程序光盘映像文件,选择对应的映像文件,然后点击下一步.选择对应的密钥和版本,设置密码等. 4.创建虚拟机名字和存储位置 ...

  10. 7、源与值(Source/Values)

    学习目录:树莓派学习之路-GPIO Zero 官网地址:https://gpiozero.readthedocs.io/en/stable/source_values.html 环境:UbuntuMe ...