【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

news2024/11/23 2:57:35

目录

进程的概念及应用

进程的定义

进程的ID

fork函数(进程创建函数)


        多进程(以及多线程)是现代计算机网络的精髓。在之前,我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面的铺垫,我们对Socket也有了一定了解。接下来,让我们一起正式开始探索真正的网络编程吧!

进程的概念及应用

进程的定义

        进程(Process)是计算机中程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

补充:

宏观上,当有多个进程运行在操作系统上时,我们看到的效果是这些程序可以同时得到响应。而从微观上看,这些(程序的)进程并非同时被执行,而是通过在CPU分配的时间片中,借助CPU的高效计算能力,被反复快速地交替执行,进而让我们视觉上看到的是“同时进行”的效果。

进程的ID

        在操作系统中,所有进程创建时都会被分配一个ID,我们将这个ID称为“进程ID”,其值为大于2的整数。值为1的进程ID通常被分配给用于协助操作系统的系统应用程序。

        在Linux中,我们可以通过 ps 命令来查看当前系统正在运行的进程,其用法如下:

                        ps [选项,见下表] 

基本选项含义
 -A, -e所有进程
 -a所有tty终端下的进程,除了对话期首进程
a所有tty终端下的进程,包括其他用户
-d全部进程,除了会话期首进程
-N, --deselect反选进程(显示进程中未显示的部分)
r运行中的进程
T当前终端下的所有进程
x非tty终端控制下的进程

        如图所示:

        根据需要,还可进一步显示进程细节,具体用法可以通过 ps --help all 查阅,在这里不再赘述。

fork函数(进程创建函数)

        在多进程服务器端中,我们常用fork函数来创建进程,具体用法如下:

#include <unistd.h>

pid_t fork(void);

//成功时返回进程ID ,失败时返回-1

        fork函数会创建调用该函数的进程的副本,即复制一份当前调用了fork函数的进程。副本进程(子进程)创建完成后,会同原进程(父进程)一起执行fork函数调用完成后的语句。在判断原进程和副本进程时,需要通过fork函数的返回值来区分。

  • 父进程:fork函数返回子进程ID
  • 子进程:fork函数返回0 

        父进程(Parent Process)指的是调用fork函数的主体,而子进程(Child Process)是通过父进程调用fork函数复制得来的进程。 

        调用fork函数后的程序运行流程如下图所示:

        从图中可以看出,父进程调用fork函数时创建了一份子进程,并由pid_t变量接收fork函数返回的进程ID值。在这之前,子进程继承了父进程之前的变量值(gval、lval)。不过在创建完成后,父进程和子进程的ID并不同,在父进程中将执行if条件满足pid!=0的语句块,即lval++;而子进程将执行pid==0的语句块,即gval++。

        让我们来验证下思路:

        fork.cpp

#include <stdio.h>
#include <unistd.h>

int gval = 10;

int main(int argc, char *argv[])
{
    pid_t pid;
    int lval = 20;
    gval++;    // gval -> 11
    lval += 5; // lval -> 25

    pid = fork();
    if (pid == 0) // 子进程
    {
        gval += 1; // gval -> 12
        lval += 2; // lval -> 27
    }
    else // 父进程
    {
        gval -= 1; // gval -> 10
        lval -= 2; // lval -> 23
    }

    pid == 0 ? printf("Child Process: gval = %d, lval = %d \n", gval, lval)
             : printf("Parent Process: gval = %d, lval = %d \n", gval, lval);
    return 0;
}

        输出结果:

        从运行结果来看,验证了我们之前的想法的正确性。需要注意的是,调用fork函数后,父进程之前的变量及其值在子进程中是一致的(也拷贝了一份),但父、子进程又有彼此完全独立的内存结构,因此在fork函数操作完成后执行的下阶段函数互不影响,结果彼此独立。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】Twin neural network regression is a semi- supervised regression algorithm

论文下载 GitHub bib: ARTICLE{,title {Twin neural network regression is a semi- supervised regression algorithm},author {Sebastian J Wetzel and Roger G Melko and Isaac Tamblyn},journal {Machine Learning: Science and Technology},year {2022},volum…

“我转行做测试开发的这一年多,月薪5K变成了18K”,中文系萌妹的自白

公司老板是我的测试引路人 本人就读于某普通院校&#xff0c;在大学期间就开始实习找工作&#xff0c;误打误撞进入一家做工业大数据的创业公司。 刚开始我并没有明确的职业发展方向&#xff0c;主要是做一些环境搭建的基础工作。但由于执行效率高&#xff0c;工作责任感强&a…

06-发送短信验证码实现登录功能

1、发送短信验证码实现登录功能的流程 1.1、获取验证码流程 1.2、登录流程 1.3、页面带有图形验证码的流程 2、 注册登录二合一页面的开发 2.1、将src目录下的App.vue页面上通用显示的删掉 2.2、在router目录下的index.js文件中通过懒加载的方式添加login.vue页面 对于rout…

【新版】系统架构设计师 - 软件工程

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件工程考点摘要软件工程概述软件能力成熟度模型软件过程模型瀑布模型原型化模型增量模型螺旋模型喷泉模型V模型迭代与增量的概念CBSD基于构件的模型&#xff08;构件组装模型/基于构件的软件开发…

PSP - 更新 MSA 搜索的全部 UniProt 蛋白序列库

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131115471 UniProt 是一个提供蛋白质序列和功能信息的数据库,由欧洲生物信息学研究所(EMBL-EBI)、美国瑞士生物技术信息中心(SIB)和美国蛋白质信息资源(…

一图详解!接口测试之HTTP协议与HTTPS协议的传输过程

目录 前言&#xff1a; 1、HTTP协议 1.1 协议 1.2 原理 1.2.1 客户端 1.2.2 服务器端 1.3 请求报文 1.3.1 报文格式 1.3.2 请求报文方法 1.4 响应报文 1.4.1 报文格式 1.4.2 响应报文状态码 2、HTTPS协议 2.1 加密算法 2.2 数字签名 2.3 传输过程 2.4 流程图 …

Kafka运维监控:Kafka-Eagle安装

kafka自身并没有集成监控管理系统&#xff0c;因此对kafka的监控管理比较不便&#xff0c;好在有大量的第三方监控管理系统来使用&#xff0c;常见的有&#xff1a; Kafka Eagle KafkaOffsetMonitor Kafka Manager&#xff08;雅虎开源的Kafka集群管理器&#xff09; Kafka …

安装和配置Canal

安装和配置Canal 下面我们就开启mysql的主从同步机制&#xff0c;让Canal来模拟salve 1.开启MySQL主从 Canal是基于MySQL的主从同步功能&#xff0c;因此必须先开启MySQL的主从功能才可以。 这里以之前用Docker运行的mysql为例&#xff1a; 1.1.开启binlog 打开mysql容器…

电商打工人的饭碗,AIGC还端不走

文 | 螳螂观察 作者 | 鲸胖胖 以ChatGPT、Midjourney、文心一言等为代表的AIGC产品&#xff0c;已经在全球掀起新一轮的AI技术变革新浪潮&#xff0c;再度刷新了人们对AI的认知&#xff0c;多个行业的商业模式和生态必然在未来会被彻底重构。 前不久&#xff0c;36氪就测使用…

【博客647】MetricsQL(VictoriaMetrics)和PromQL(Prometheus)的不同之处

MetricsQL(VictoriaMetrics)和PromQL(Prometheus)的不同之处 1、如果对PromSQL不熟悉可以先看以下链接 https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085 2、与PromQL相比&#xff0c;以下功能在MetricsQL中的实现方式不同&#xff0c;这也改善了用户…

AI实战营第二期 第六节 《MMDetection代码课》——笔记7

什么是MMDetection&#xff1f; MMDetection 是被广泛使用的检测工具箱&#xff0c;包括了目标检侧、实例分割、全景分割等多个通用检测方向&#xff0c;并支持了 75 个主流和前沿模型&#xff0c; 为用户提供超过 440 个预训练模型, 在学术研究和工业落地中拥有广泛应用。该恇…

帧布局叠放视图

线性视图只会将视图组织到一行或一列中&#xff0c;每个视图都在屏幕上有自己的位置不会重叠。如果希望布局能够重叠&#xff0c;有个很简单的做法就是使用帧布局。 本文实现一个图像上显示文本的例子。 定义帧布局 <?xml version"1.0" encoding"utf-8&quo…

C++类和对象-5

本篇博客来讲述C类和对象中的最后一些内容&#xff0c;即友元和const的使用方法。 目录 1.友元 1.1引入 1.2内容 1.2.1友元函数 1.2.2友元类 1.3内部类 2.const修饰 2.1内容 2.1.1常数据成员 2.1.2常成员函数 2.1.3常对象 2.2示例 1.友元 1.1引入 在讲述友元之…

使用DR对流量进行管理 subnet子集的定义

这里vs可以控制往svc1和svc2流量走的比例&#xff0c;但是这里只假设往svc3里面走。现在想控制的是往pod1和pod2各走多少流量。 流量到了svc3的时候还是使用的是kube-proxy对流量进行转发。 了解DR DR定义的是经过VS之后已经到达service的流量&#xff0c;主要可以用于&#xf…

【深度学习入门:基于Python的理论与实现】

文章目录 神经网络从感知机到神经网络神经网络的例子复习感知机激活函数登场 激活函数sigmoid函数阶跃函数的实现sigmoid函数的实现 sigmoid函数和阶跃函数的比较ReLU函数 3层神经网络的实现符号确认代码实现 输出层的设计恒等函数和softmax函数输出层的神经元数量 手写数字识别…

【ArcGIS Pro二次开发】(36):度分秒转十进制度

经纬度坐标的表达方式比较常用的一般有2种&#xff0c;【度分秒和十进制度】。 在成果展示中&#xff0c;以【度分秒】居多&#xff0c;但如果要将坐标导入ArcGIS中&#xff0c;则一般需要用到【十进制度】&#xff0c;这个转换可以在Excel中进行&#xff0c;也可以在ArcGIS中的…

火龙果MM32F3273G8P开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置

火龙果MM32F3273G8P开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置 1、Systick寄存器 Systick是ARM内核的一个外设&#xff0c;所以在不同芯片的代码上移植比较方便&#xff0c;他总共有4个寄存器&#xff0c; 从Systick定义中可以看到&#xff1a; typedef struct {__I…

Android系统的启动流程(二):SystemServer处理过程

Android系统的启动流程&#xff08;二&#xff09;&#xff1a;SystemServer处理过程 摘要 在上篇文章中&#xff0c;我们已经将启动的进程推进到了ZygoteInit的main中&#xff0c;在ZygoteInit中我们已经知道它的main方法中的forkSystemServer方法将会启动系统服务&#xff0…

机器学习 | 支持向量机SVM | 概念了解向

概念了解向&#xff0c;参考视频&#xff1a; 【小萌五分钟】机器学习 | 支持向量机 SVM &#x1f4da;最大间隔分类器 如下图有两种不同颜色的点。我需要一个分类器告诉我&#xff0c;假设在下图中新加入一个点&#xff0c;应该将它分类至红点还是蓝点。考虑加入一条决策边界…

【4 微信小程序学习 - WXSS-WXML-WXS语法】

1 WXSS相关 1 小程序样式的写法 2 WXSS支持的选择器 3 wxss的扩展 – 尺寸单位RPX rpx是为了屏幕自适应. 4 逻辑判断 wx:if – wx:elif – wx:else 对应v-if <!-- 2.条件判断 --> <view wx:if"{{score > 90}}">优秀</view> <view wx:…