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 < ) {
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函数的更多相关文章
- C/C++网络编程9——多进程服务器端实现
#include <iostream> #include <unistd.h> #include <cstdlib> #include <arpa/inet. ...
- C/C++网络编程8——多进程服务器端之销毁僵尸进程
上一节提到,当子进程执行结束,父进程还在执行,在父进程结束之前子进程会成为僵尸进程,那么怎么销毁僵尸进程呢?父进程主动接收子进程的返回值. 销毁僵尸进程的方法: 1:使用wait函数 2:使用wait ...
- TCP/IP网络编程之多进程服务端(二)
信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...
- 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型
进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...
- TCP/IP网络编程之多进程服务端(一)
进程概念及应用 我们知道,监听套接字会有一个等待队列,里面存放着不同客户端的连接请求,如果有一百个客户端,每个客户端的请求处理是0.5s,第一个客户端当然不会不满,但第一百个客户端就会有相当大的意见了 ...
- 网络编程中的read,write函数
关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...
- 网络编程readn、writen和readline函数的编写
readn 在Linux中,read的声明为: ssize_t read(int fd, void *buf, size_t count); 它的返回值有以下情形: 1.大于0,代表成功读取的字节 ...
- UNIX网络编程读书笔记:地址操纵函数
地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址. 1.inet_aton.inet_addr.inet_ntoa inet ...
- 深入浅出--UNIX多进程编程之fork()函数
0前言 上周都在看都在学习unix环境高级编程的第八章--进程控制.也就是这一章中.让我理解了unix中一些进程的原理.以下我就主要依照进程中最重要的三个函数来进行解说.让大家通过阅读这一篇文章彻底明 ...
随机推荐
- Codeforces Round #624 (Div. 3) C. Perform the Combo(前缀和)
You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...
- Git - 03. git 工作空间
1. 概述 git 存放代码的地方 2. 创建 命令 # 1. 从无到有 > git init # 2. 从远程拉去现有的仓库 > git clone <url> 3. 文件生 ...
- 433B.Kuriyama Mirai's Stones
Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from ...
- 插入数据:insert,replace
*insert高级用法* 1.语法:insert into tbname(字段列表) values 值列表; 1.1可以不将所有的字段都插入数据.如果说需要完成部分字段的插入,需要必须存在字段列表. ...
- LinuxC下argv,argc[]的意义
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- 利用单臂路由实现VLAN间的路由
实验4:利用单臂路由实现VLAN间的路由. 实验原理: 实验内容: 本实验模拟公司网络场景,路由器R1是公司的出口网关,员工PC通过接入层交换机(如S2和S3)接入公司网络,接入层交换机又通过汇聚交 ...
- java篇 之 静态
Final:不可改变 Static:静态修饰符,在编译阶段就能确定了,可以修饰成员变量,相应的称之为静态变量 是一个共享的变量(被这个类和这个类所产生的对象所共享的,他是唯一的,出生时间 为类第一次产 ...
- 【Struts 文件上传下载】
RegisterAction package k.action; import k.domain.User; import k.form.UserForm; import k.service.User ...
- 【HTML】输入密码访问
<script> (function(){ if('{{ page.password }}'){ if (prompt('请输入文章密码') !== '{{ page.password } ...
- 计算机二级-C语言-对文件的读写操作。链表的定义与赋值。对字符串的遍历和处理。
//程序填空题:在此程序中,通过定义学生结构体变量,存储了学生的学号,姓名和三门课的成绩.所有学生数据均以二进制方式输出到文件中.函数fun()函数的功能是重写形参filename所指文件中最后一个学 ...