unix中的exec族函数介绍

news2024/10/4 2:35:20

一、前言

本文将介绍unix中exec族函数,包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后,新进程可以直接执行原本正文段的其他内容,但更多时候,我们在一个进程中调用fork创建新的进程后,希望新进程能够执行其他的程序。(举个实际的例子,A进程调用fork后,我们更多的时候是希望子进程能够运行B程序,而不是用于处理A进程特定的内容)exec族函数的作用就是让一个进程执行另一个程序。
本文将围绕如下内容展开:
1.exec族函数的原理
2.exec族各函数介绍

二、exec族函数原理

当一个进程调用了exec类函数后,该进程的正文段、数据段、堆、栈都替换为磁盘中其他指定的程序的内容,即子进程的进程空间被替换了其他内容。不过子进程的PID是不变的。子进程从新程序的main函数开始执行。新程序会继承子进程的如下信息:

  1. 文件描述符:新程序会继承调用进程的打开文件描述符,包括标准输入、标准输出和标准错误,除非这些文件描述符在调用 exec 前被显式地关闭或更改。
  2. 环境变量:新程序会继承调用进程的环境变量。
  3. 当前工作目录:新程序会继承调用进程的当前工作目录。
  4. 进程用户和组 ID:新程序会继承调用进程的用户 ID(UID)和组 ID(GID)。
  5. 信号处理状态:新程序会继承调用进程的信号处理状态,包括信号屏蔽字。
  6. 一些状态信息:比如进程优先级(nice值)等。

三、exec类函数介绍

unix提供了7个exec类函数,本小节将分别介绍这7种函数。

3.1 execl

头文件:#include <unistd.h>
函数原型:int execl(const char *path, const char
*arg0, …, (char *) NULL);
传入参数:
{
path:要执行的程序的路径。
arg0:新程序的第一个参数,通常是程序的名称(用于 argv[0])。
…:紧接着的参数列表,用于传递给新程序的其他参数,最后需要以NULL 结束。
}
返回值: 成功时,execl 不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno设定相应的错误代码。

参考代码:

/*************************************************************************
        > File Name: exec_test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时12分08秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/


/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;
    pid_t pid;

    if((pid = fork()) < 0)
    {
        printf("fork fail!\n");
    }
    else if(pid == 0)
    {
        if(execl("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test", NULL) == -1)
        {
            printf("execl fail!\n");
        }
    }
    else
    {
        printf("This is father process! child's pid = %d\n",pid);
    }


    return ret;
}

需要调用的程序代码如下:

/*************************************************************************
        > File Name: test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时16分00秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/


/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;

    while(1)
    {
        printf("This is %s!\n",__FILE__);
        sleep(1);
    }

    return ret;
}

运行结果如下所示:
在这里插入图片描述

(3.1-1)

3.2 execv

头文件:#include <unistd.h>
函数原型:int execv(const char *path, char *const
argv[]);
传入参数:
{
path:要执行的程序的路径。
argv:参数数组,包含新程序的参数列表。数组的第一个元素通常是程序名称(用于 argv[0]),最后一个元素必须是 NULL以标示参数列表的结束。
}
返回值: 成功时,execv 不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno设定相应的错误代码。

参考代码如下:

/*************************************************************************
        > File Name: exec_test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时12分08秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/
#define EXECV

/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;
    pid_t pid;
#ifdef EXECV
    char *arg[] = {NULL};
#endif

    if((pid = fork()) < 0)
    {
        printf("fork fail!\n");
    }
    else if(pid == 0)
    {
#ifdef EXECL
        if(execl("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test", NULL) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECV)
        if(execv("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", arg) == -1)
        {
            printf("execl fail!\n");
        }
#endif

    }
    else
    {
        printf("This is father process! child's pid = %d\n",pid);
    }


    return ret;
}

运行结果如下图所示:
在这里插入图片描述

(3.2-1)

3.3 execle

头文件:#include <unistd.h>
函数原型:int execle(const char *path, const char
*arg0, …, (char *) NULL, char *const envp[]);
传入参数:
{
path:要执行的程序的路径。
arg0:新程序的第一个参数,通常是程序的名称(用于 argv[0])。
…:紧接着的参数列表,用于传递给新程序的其他参数,最后需要以 NULL 结束。
envp: 一个指向环境变量字符串数组的指针,环境变量以
NULL 结尾。
}
返回值: 成功时,execv 不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno设定相应的错误代码。 这个函数与上面两个的区别就是能够设置环境变量。

参考代码如下:

/*************************************************************************
        > File Name: exec_test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时12分08秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/
//#define EXECV
#define EXECLE

/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;
    pid_t pid;
#ifdef EXECV
    char *arg[] = {NULL};
#endif

#ifdef EXECLE
    char *envp[] = {"AUTHER=Conbiao",NULL};
#endif

    if((pid = fork()) < 0)
    {
        printf("fork fail!\n");
    }
    else if(pid == 0)
    {
#ifdef EXECL
        if(execl("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test", NULL) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECV)
        if(execv("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", arg) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECLE)
        if(execle("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test",NULL,envp) == -1)
        {
            printf("execl fail!\n");
        }
#endif

    }
    else
    {
        printf("This is father process! child's pid = %d\n",pid);
    }


    return ret;
}

test.c添加获取环境变量的操作,代码如下:

/*************************************************************************
        > File Name: test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时16分00秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/


/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;

    printf("<%s> Author is: %s\n",__FILE__,getenv("AUTHER"));

    while(1)
    {
        printf("This is %s!\n",__FILE__);
        sleep(1);
    }

    return ret;
}

运行结果如下所示:
在这里插入图片描述

(3.3-1)

3.4 execve

头文件:#include <unistd.h>
函数原型:int execve(const char *path, char *const
argv[], char *const envp[]);
传入参数:
{
path:要执行的程序的路径。
argv:参数数组,包含新程序的参数列表。数组的第一个元素通常是程序名称(用于 argv[0]),最后一个元素必须是 NULL以标示参数列表的结束。
envp: 一个指向环境变量字符串数组的指针,环境变量以 NULL 结尾。
}
返回值: 成功时,execv不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno 设定相应的错误代码。

这个函数其实就是将一个个参数以字符串数组的形式传入而已,在此就不做过多的介绍了。

3.5 execlp

头文件:#include <unistd.h>
函数原型:int execlp(const char *file, const char
*arg0, …, (char *) NULL);
传入参数:
{
file:要执行的程序的名称。该名称可以是相对路径或可执行文件的名称,execlp 函数会在环境变量 PATH 指定的目录中搜索该程序。
arg0:新程序的第一个参数,通常是程序的名称(用于 argv[0])。 …: 后续参数,用于传递给新程序的其他参数,最后需要以NULL 结束。
}
返回值: 成功时,execv 不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno设定相应的错误代码。

参考代码如下:

/*************************************************************************
        > File Name: exec_test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时12分08秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>

/***********************************************************************
 *                              MACRO
 **********************************************************************/
//#define EXECV
//#define EXECLE
#define EXECLP
/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;
    pid_t pid;
#ifdef EXECV
    char *arg[] = {NULL};
#endif

#ifdef EXECLE
    char *envp[] = {"AUTHER=Conbiao",NULL};
#endif

    if((pid = fork()) < 0)
    {
        printf("fork fail!\n");
    }
    else if(pid == 0)
    {
#ifdef EXECL
        if(execl("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test", NULL) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECV)
        if(execv("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", arg) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECLE)
        if(execle("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test",NULL,envp) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECLP)
        if(execlp("ls","-l",NULL) == -1)
        {
            printf("execl fail!\n");
        }
#endif

    }
    else
    {
        printf("This is father process! child's pid = %d\n",pid);
    }


    return ret;
}

运行结果如下:
在这里插入图片描述

(3.5-1)

3.6 execvp

头文件:#include <unistd.h>
函数原型:int execvp(const char *file, char *const
argv[]);
传入参数:
{
file:要执行的程序的名称。该名称可以是相对路径或仅是可执行文件的名称,execvp 会在环境变量PATH 指定的目录中搜索该程序。
argv:参数数组,包含新程序的参数列表。数组的第一个元素通常是程序名称(用于argv[0]),最后一个元素必须是 NULL 以标示参数列表的结束。
}
返回值: 成功时,execv 不会返回,如果返回,通常表示出错。出错时,返回 -1,并通过 errno 设定相应的错误代码。

该函数的功能与execv类似,就不做过多的介绍了。

3.7 fexecve

头文件:#include <unistd.h>
函数原型:int fexecve(int fd, char *const argv[],
char *const envp[]);
传入参数: { fd:一个文件描述符,指向要执行的可执行文件。这个文件描述符必须是通过 open系统调用以读执行模式打开的。
argv:参数数组,包含新程序的参数列表。数组的第一个元素通常是程序名称(用于argv[0]),最后一个元素必须是 NULL 以标示参数列表的结束。
envp: 一个指向环境变量字符串数组的指针,环境变量以 NULL结尾。
}
返回值: 成功时,execv 不会返回,如果返回,通常表示出错。 出错时,返回 -1,并通过 errno 设定相应的错误代码。

参考代码如下:

/*************************************************************************
        > File Name: exec_test.c
        > Author: conbiao
        > Created Time: 2024年09月29日 星期日 15时12分08秒
 ************************************************************************/

/***********************************************************************
 *                             HEADER
 **********************************************************************/
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<fcntl.h>
/***********************************************************************
 *                              MACRO
 **********************************************************************/
//#define EXECV
//#define EXECLE
//#define EXECLP
#define FEXECVE
/***********************************************************************
 *                          GLOBAL VARIABLE
 **********************************************************************/


/***********************************************************************
 *                       FUNCTION DESCRIPTION
 **********************************************************************/



/***********************************************************************
* FUNCTION NAME:
 ***********************************************************************
*
* Summary:
*
* Params:
*
* Return:
*
***********************************************************************/


/***********************************************************************
 *                                MAIN
 **********************************************************************/
int main(int argc, char *argv[])
{
    int ret = 0;
    pid_t pid;
#ifdef FEXECVE
    char *arg[] = {NULL};
#endif

#ifdef FEXECVE
    char *envp[] = {"AUTHER=Conbiao",NULL};
#endif

    if((pid = fork()) < 0)
    {
        printf("fork fail!\n");
    }
    else if(pid == 0)
    {
#ifdef EXECL
        if(execl("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test", NULL) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECV)
        if(execv("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", arg) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECLE)
        if(execle("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test", "test",NULL,envp) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(EXECLP)
        if(execlp("ls","-l",NULL) == -1)
        {
            printf("execl fail!\n");
        }
#elif defined(FEXECVE)
        int fd = open("/home/bb-yy/zijide/study/system/linux/unix-like-app/exec/test",O_EXCL | O_RDONLY);
        if(fd == -1)
        {
            printf("open file fail!\n");
        }
        else
        {
            if(fexecve(fd,arg,envp) == -1)
            {
                printf("fexecve fail!\n");
            }
        }
#endif

    }
    else
    {
        printf("This is father process! child's pid = %d\n",pid);
    }


    return ret;
}

运行结果如下:
在这里插入图片描述

(3.7-1)

参考资料:

《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》

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

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

相关文章

在pycharm中设置后直接运行js代码

环境&#xff1a; pycharm专业版2020.3.2 已经安装nodejs和npm&#xff0c;并已经加入环境变量。 nodejs的安装参考在pycharm中运行js文件以及附加node.js下载步骤_python_脚本之家 下面开始在pycharm中设置&#xff0c;让其可以直接运行js代码&#xff0c;即需要安装一个叫…

C# 字符与字符串

本课要点&#xff1a; 1、字符类Char的使用 2、字符串类String的使用 3、可变字符串****StringBuilder 4、常见错误 一 何时用到字符与字符串 问题&#xff1a; 输出C#**课考试最高分&#xff1a;**98.5 输出最高分学生姓名&#xff1a;张三 输出最高分学生性别&#x…

六.应用层

目录 ​编辑 4.11 DHCP 6.1应用层的概述 6.2网络应用模型 CS P2P 6.3DNS 域名 www是什么&#xff0c;http是什么&#xff0c;到底什么区别&#xff1f; DNS出现及演化 DNS概括 DNS域名解析过程 6.4FTP FTP客户/服务器 FTP工作原理 FTP传输模式 6.5电子邮件 电…

King of Range 2024牛客国庆集训派对day3

原题 King of Range 解析 m 的值不大, 每次时间在 n logn 以内即可 我们遍历整个数组, 以 i 为右边界, 检测是否有满足条件的左边界, 一次只加上左面的所有可能, 用两个双向队列维护两个单调栈, 一个存最大值, 一个存最小值, 这样可以帮助找到合适的左边界 代码 #include …

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试&#xff1a;模拟外卖订单处理&#xff0c;客户支付提交订单后&#xff0c;查询订单详情&#xff0c;后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快&#xff0c;一转眼不到一个月时间&#xff0c;已经完成分享synchronized、volatile、…

Linux应用——简易日志

1. 日志要求 对于一个日志来说&#xff0c;我们任认为其应该具有以下的内容 1. 日志时间 2. 日志等级 3. 日志内容 4. 文件名称与行号 在此基础上我们对不同的日志做出分级&#xff0c;即 info: 常规信息 warning: 报警信号 error: 严重信号&#xff0c;可能需要立…

UNIAPP 动态菜单实现方法

1. 封装tabbar组件&#xff0c;组件UI使用uview的tabbar allList 定义出全部的菜单 list 定义当前用户能看到的菜单使用 u-tabbar 渲染出来 list 2. 权限判断处理 3. 使用方式 在 tab 页&#xff0c;底部放入该 tab 组件&#xff0c;并设置当前回显的页面&#xff0c;这里使用…

STM32F407寄存器操作(DMA+I2C)

1.前言 因为后面需要用到大量基础通讯传输的问题&#xff0c;于是今天折腾了一下DMA传输I2C与SPI的效果&#xff0c;其实我先是把DMASPI搞出来了。但是考虑到网上对于STM32的I2C微词颇多&#xff0c;基础的协议都没有调试出来&#xff0c;更遑论DMA控制了&#xff0c;前面调不…

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1&#xff09;递归版本2&#xff09;非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结&#xff08;排序算法稳定性&am…

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候&#xff0c;效果是否会很好&#xff1f;在这篇论文中&#xff0c;作者给出了答案&#xff1a;Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…

使用html写一个能发起请求的登录界面

目录 head部分 内联样式部分 body部分 login-form类的div myModal类的div id script部分 总的代码 界面与操作演示 <!DOCTYPE html> <html lang"en"> <!DOCTYPE html> 这是文档类型声明&#xff0c;告诉浏览器这是一个 HTML文档。 <…

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 &#xff1a;setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1&#xff09;Http请求默认值 作用范围是该线程组下的所有HTTP请求&#xff0c;如果http请求设置的与默认值冲突&#xff0…

前端规范工程-3:CSS规范(Stylelint)

样式规范工具&#xff08;StyleLint&#xff09; Stylelint 是一个灵活且强大的工具&#xff0c;适用于保持 CSS 代码的质量和一致性。结合其他工具&#xff08;如 Prettier 和 ESLint&#xff09;&#xff0c;可以更全面地保障前端代码的整洁性和可维护性。 目录 样式规范工具…

oracle virtualBox 拖动文件到虚拟机内报错

DnD: Error: Drag and drop to guest not possible -- either the guest OS does not support this, or the.... 首先将拖放的双向选项打开 打开CD驱动器 根据操作系统是32还是64安装对应的安装包&#xff0c;amd64为64位系统&#xff0c;x86为32位系统 安装后重启即可向虚拟机…

【C语言】数组练习

【C语言】数组练习 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚练习2、二分查找 练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 练习2、二分查找 在⼀个升序的数组中查找指…

sql语句牛客练习

文章目录 1. SQL21 浙江大学用户题目回答情况① 错误② 正确 2. SQL22 统计每个学校的答过题的用户的平均答题数① 错误② 正确 3. SQL23 统计每个学校各难度的用户平均刷题数4. SQL25 查找山东大学或者性别为男生的信息① 错误② 正确 5. SQL26 计算25岁以上和以下的用户数量①…

Wireshark 解析QQ、微信的通信协议|TCP|UDP

写在前面 QQ&#xff0c;微信这样的聊天软件。我们一般称为im&#xff0c;Instant Messaging&#xff0c;即时通讯系统。那大家会不会有疑问&#xff0c;自己聊天内容会不会被黑客或者不法分子知道&#xff1f;这种体量的im是基于tcp还是udp呢&#xff1f;这篇文章我们就来探索…

基于Springboot的在线订餐系统设计与实现(论文+源码)_kaic

摘 要 当今世界&#xff0c;互联网以及和互联网有关的行业都在不断的发展&#xff0c;也在持续走进人们的生活&#xff0c;在此趋势下人们对于通过互联网解决生活问题的需求愈来愈多&#xff0c;本文考虑到了这些情况后做出了该订餐系统。 本系统选择了MySQL作为主要存储单元…

搭建k8s集群服务(kubeadm方式)

准备工作 操作系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) 虚拟机硬件配置&#xff1a;2核8G内存&#xff08;最低2G&#xff09;&#xff0c;硬盘最低25G&#xff1b; linux内核版本&#xff08;3.10版本尝试失败&#xff09;&#xff1a;5.4.268-1.el7.elr…