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

这篇具有很好参考价值的文章主要介绍了【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

进程的概念及应用

进程的定义

进程的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终端控制下的进程

        如图所示:

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

        根据需要,还可进一步显示进程细节,具体用法可以通过 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函数后的程序运行流程如下图所示:

【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及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;
}

        输出结果:

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

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

到了这里,关于【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP服务器实现—多进程版,多线程版,线程池版

    目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结         在上一篇文章中使用TCP协议实现了一个简单的服务器,可以用来服务端和客户端通信,但是之前的服务器存在一个问题,就是当有多个客户端连接服务器的时候,服务器只能和一个客户端通信,其它的客

    2024年02月12日
    浏览(47)
  • [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单进程、多进程、多线程、线程池tcp服务器

    网络的上一篇文章, 我们介绍了网络变成的一些重要的概念, 以及 UDP套接字的编程演示. 还实现了一个简单更简陋的UDP公共聊天室. [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现…

    2024年02月16日
    浏览(66)
  • 多进程并发TCP服务器模型(含客户端)(网络编程 C语言实现)

    摘要 :大家都知道不同pc间的通信需要用到套接字sockte来实现,但是服务器一次只能收到一个客户端发来的消息,所以为了能让服务器可以接收多个客户端的连接与消息的传递,我们就引入了多进程并发这样一个概念。听名字就可以知道--需要用到进程,当然也有多线程并发

    2024年02月17日
    浏览(67)
  • 网络通信(13)-C#TCP服务器和客户端同时在一个进程实现的实例

    有时项目需求中需要服务器和客户端同时在一个进程实现,一边需要现场接收多个客户端的数据,一边需要将数据汇总后发送给远程服务器。下面通过实例演示此项需求。 C#TCP服务器和客户端同时在一个进程实现的实例如下: 界面设计 UI文件代码

    2024年01月22日
    浏览(65)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)
  • Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

    TCP三次握手 TCP 三次握手 (TCP three-way handshake)是TCP协议建立可靠连接的过程,确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程: 假设客户端为A,服务器为B 1 、第一次握手(SYN=1,seq=500) A向B发送一个带有SYN标志位的数据包,表示A请求建立连接。

    2024年02月06日
    浏览(62)
  • 【TCP/IP】利用I/O复用技术实现并发服务器 - select函数

    目录 I/O复用技术 select函数 设置文件描述符 指定监视范围 设置超时 I/O复用服务器端的实现        由服务器创建多个进程来实现并发的做法有时会带来一些问题,比如:内存上的开销、CPU的大量占用等,这些因素会消耗掉服务器端有限的计算资源、进而影响程序之间的执

    2024年02月08日
    浏览(51)
  • Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

    1、TCP三次握手 TCP 三次握手 (TCP three-way handshake)是 TCP协议建立可靠连接 的过程,确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的 详细过程 : 假设客户端为A,服务器为B。 (1) 第一次握手 第一次握手(SYN=1,seq=500) A向B发送一个带有 SYN 标志位的数据包,

    2024年04月22日
    浏览(55)
  • Linux网络编程之TCP/IP实现高并发网络服务器设计指南

    目录 引言: 多进程服务器 例程分享: 多线程服务器  例程分享: I/O多路复用服务器 select 例程分享: poll 例程分享: epoll 例程分享: 总结建议         随着互联网的迅猛发展,服务器面临着越来越多的并发请求。如何设计一个能够高效处理大量并发请求的服务器成为

    2024年02月20日
    浏览(54)
  • 网络编程(一)TCP单进程服务器编程详解

    想要学习socket网络编程的读者一定要首先学好计算机网络的理论知识,包括 1)osi网络七层模型与ip四层模型 2)套接字含义 3)局域网通信过程 4)广域网通信过程 5)tcp,udp通信协议,在这两个协议中的连接建立,数据封装,传输过程,传输中可能遇到的问题的处理(差错控

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包