unix中的exec族函数介绍

一、前言

本文将介绍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)》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杭州电子科技大学《2019年+2023年861自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《杭州电子科技大学861自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2019年真题 2023年真题 Part1&#xff1a;2019年2023年完整版真题 2019年真题 2…

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问&#xff1a; 小心不要改到这里了&#xff1a;sudo nano /etc/ssh/ssh_config 而是&#xff1a;/etc/ssh/sshd_config sudo nano /etc/ssh…

猫猫cpu的缓存

原题过长&#xff0c;放一下题目大意 题目大意 给你 m m m 个 1 1 1 到 n n n 之间的整数&#xff0c;你要找到若干个大小为固定的 k k k 的闭区间&#xff0c;使得所有这些数都在你找到的某个区间内。你需要最小化这些区间的并集的大小&#xff0c;并输出此大小。本题里…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…

calibre-web的翻译translations

calibre-web的翻译translations Windows安装calibre-web&#xff0c;Python-CSDN博客文章浏览阅读539次&#xff0c;点赞10次&#xff0c;收藏11次。pip install calibreweb报错&#xff1a;error: Microsoft Visual C 14.0 or greater is required. Get it with "Microso…

机器学习(5):机器学习项目步骤(二)——收集数据与预处理

1. 数据收集与预处理的任务&#xff1f; 为机器学习模型提供好的“燃料” 2. 数据收集与预处理的分步骤&#xff1f; 收集数据-->数据可视化-->数据清洗-->特征工程-->构建特征集和数据集-->拆分数据集、验证集和测试集 3. 数据可视化工作&#xff1f; a. 作用&…

深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp

目录&#xff1a; 前言一、 memcpy 函数二、 memmove 函数三、 memset 函数四、 memcmp 函数总结 前言 在 C 语言中&#xff0c;内存操作函数是非常重要的工具&#xff0c;它们允许我们对内存进行直接操作&#xff0c;从而实现高效的数据处理。本文将深入探讨四个常用的内存操…

DC00022基于ssm高校社团管理系统web社团管理系统java web+MySQL项目web程序设计

1、项目功能演示 DC00022基于ssm高校社团管理系统web社团管理系统java web项目MySQL 2、项目功能描述 社团管理系统分为普通用户、管理员 2.1 普通用户功能 01 系统登录、系统注册 02 系统首页、新闻公告、规章制度、社团活动、互动交流 03 修改密码 04 个人信息修改 05 我的…

Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影

针对Win10鼠标频繁自动失去焦点的问题&#xff0c;可以尝试以下解决方案&#xff1a; 一、修改注册表&#xff08;最有效的方法-重启之后立竿见影&#xff09; 打开注册表编辑器&#xff1a; 按下WindowsR组合键&#xff0c;打开运行窗口。在运行窗口中输入“regedit”&#x…

ECP 集成字段非必填配置

导读 INTRODUCTION 非必填设置&#xff1a;ECP主数据同步的时候&#xff0c;经常遇到一个问题&#xff0c;就是ECP报错&#xff0c;但是这个字段两边的ecp顾问与sf顾问都觉得没实际意思&#xff0c;觉得没有传输的必要性&#xff0c;这个时候我们就可以考虑非必输的字段不必输…

【机器学习】集成学习——提升模型准确度的秘密武器

【机器学习】集成学习——提升模型准确度的秘密武器 1. 引言 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个弱模型来提升整体预测准确性的技术。通过将多个模型的预测结果进行组合&#xff0c;集成学习在复杂任务中展现了极强的泛化能力。本文将探讨…

Redis篇(面试题 - 连环16炮)(持续更新迭代)

目录 &#xff08;第一炮&#xff09;一、Redis&#xff1f;常用数据结构&#xff1f; 1. 项目里面到了Redis&#xff0c;为什么选用Redis&#xff1f; 2. Redis 是什么&#xff1f; 3. Redis和关系型数据库的本质区别有哪些&#xff1f; 4. Redis 的线程模型了解吗&#x…

C++ -引用-详解

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C -引用-详解 1.引用基础1.1是什么1.2特点 2.引用的意义3.引用的应用场景3.1作为参数3.2作为返回值传值返回引用返回 4.权限问题5.与指针的区别6.总结 1.引用基础 1.1是什么 …

计算机网络期末复习真题(附真题答案)

前言&#xff1a; 本文是笔者在大三学习计网时整理的笔记&#xff0c;哈理工的期末试题范围基本就在此范畴内&#xff0c;就算真题有所更改&#xff0c;也仅为很基础的更改数值&#xff0c;大多跑不出这些题&#xff0c;本文包含简答和计算等大题&#xff0c;简答的内容也可能…

话术挂断之后是否处理事件

文章目录 前言联系我们解决方案方案一方案二 前言 流程&#xff1a;自动外呼进入机器人话术。问题&#xff1a;在机器人放音时用户挂断后&#xff0c;话术还会继续匹配流程&#xff0c;如果匹配上的是放音节点&#xff0c;还会进行放音&#xff0c;那么在数据库表conversation…

stm32四足机器人(标准库)

项目技术要求 PWM波形的学习 参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客 舵机的学习 参考文章 stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)…

Stream流的初步认识,Stream流的思想和获取Stream流

一.Stream流的作用 package com.njau.my_stream;import java.util.ArrayList;/*** 目标&#xff1a;认识Stream流* 案例&#xff1a;将以“张”开头的人名筛选出来到一个新的集合中去&#xff0c;再将其中三个字的名字的筛选出来到新集合中去*/ public class StreamDemo1 {pub…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

【FPGA开发】Xilinx FPGA差分输入时钟的使用方法

正文 以前在使用ZYNQ的领航者ZYNQ7020进行FPGA学习时&#xff0c;它们使用的单端50M的输入时钟&#xff0c;在verlog代码编写上比较简单&#xff0c;而现在使用Alinx的AXU3EG开发板时&#xff0c;发现它使用的是200M的差分输入时钟&#xff0c;哪这个时候&#xff0c;输入时钟要…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…