当前位置: 首页 > news >正文

实验三 进程间通信实验

一、实验目的

1、了解什么是信号。

2、熟悉LINUX系统中进程之间软中断通信的基本原理。

3、理解进程的同步关系。

4、掌握用信号实现进程间的同步操作。

5、了解什么是管道。

6、熟悉UNIX/LINUX支持的管道通信方式。

、实验内容

1、阅读下列程序,执行程序并给出结果截屏,分析程序功能。(2分)

1) #include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/types.h>

#include<sys/wait.h>

int k;

void func()

{   k=0; }

main()

{   int p;

        while((p=fork())==-1);

        if(p==0) //子进程

        {   k=1;

            signal(10,func);

            while(k!=0);

            printf("Child process is killed by parent!\n");

        }

        else //父进程

        {   sleep(1);

            kill(p,10);

            wait(0);

            printf("Parent process has killed!\n");

        }  

}

编译及执行过程和结果截屏:

程序实现功能(父进程和子进程分别做了什么?):

父进程创建子进程,并在创建成功后,等待1秒钟后向子进程发送信号10(SIGUSR1)。子进程在收到信号后,将k设置为0,进入循环等待k为0,并在k为0时输出"Child process is killed by parent!"。父进程在发送信号后,等待子进程结束,并在子进程结束后输出"Parent process has killed!"。

  1. #include<unistd.h>

#include<signal.h>

#include<stdio.h>

int k=1;

void func()

{   k=0; }

main()

{

        signal(SIGINT,func);

        while(k!=0);

        printf("\n main process is killed by keybreak!\n");

}

编译及执行过程和运行结果截屏:

解释程序实现的功能:

程序中定义了一个全局变量k,并将其初始值设置为1。然后通过signal函数将SIGINT信号(键盘中断信号)与一个自定义的信号处理函数func关联起来。在信号处理函数func中,将全局变量k的值设置为0,表示程序需要结束。在主函数中,通过一个while循环来监测k的值,如果k的值不为0,则一直循环。当用户在键盘上按下Ctrl+C键时,会触发SIGINT信号,从而调用信号处理函数func,将k的值设置为0,退出循环。最后,程序会打印出一条提示信息,表示主进程被键盘中断信号终止。

2、编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止: 

                       Child process 1 is killed by parent!

                       Child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止:

                        Parent process is killed!

要求给出编译及执行过程和运行结果截屏。(2分)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/wait.h>

pid_t child_process1;

pid_t child_process2;

void signal_handler(int signum) {

    kill(child_process1, SIGINT);

    kill(child_process2, SIGINT);

}

void child1_signal_handler(int signum) {

    printf("Child process 1 is killed by parent!\n");

    exit(0);

}

void child2_signal_handler(int signum) {

    printf("Child process 2 is killed by parent!\n");

    exit(0);

}

int main() {

    child_process1 = fork();

   

    if (child_process1 == 0) {

        // Child process 1

        signal(SIGINT, child1_signal_handler);

        while(1);

    }

   

    child_process2 = fork();

   

    if (child_process2 == 0) {

        // Child process 2

        signal(SIGINT, child2_signal_handler);

        while(1);

    }

   

    if (child_process1 > 0 && child_process2 > 0) {

        // Parent process

        signal(SIGINT, signal_handler);

        wait(NULL);

        wait(NULL);

        printf("Parent process is killed!\n");

        exit(0);

    }

   

    return 0;

}

编译及执行过程和运行结果截屏:

3、编写程序,利用信号实现司机售票员同步操作问题。要求给出编译及运行过程和结果截图。(2分)

参考程序框架:

#include <unistd.h>

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/wait.h>

int k;

void func()

{

    k = 0;

}

int main()

{

    int p;

    int count = 3;

   

    signal(12, func);

   

    while ((p = fork()) == -1);

   

    if (p > 0) // 司机进程

    {

        while (count)

        {

            k = 1;

            sleep(1);

            printf("driver: drive\n");

            printf("driver: stop\n");

           

            // 发送信号给售票员

            kill(p, 10);

           

            while (k);

           

            printf("driver: start\n");

            count--;

        }

    }

    else // 售票员进程

    {

        signal(10, func);

       

        while (count)

        {

            k = 1;

            printf("conductor: sell ticket.\n");

           

            while (k);

           

            printf("conductor: open door.\n");

            printf("conductor: close door.\n");

           

            // 取得司机进程的识别码

            pid_t driver_pid = getppid();

           

            // 发送信号给司机

            kill(driver_pid, 12);

           

            count--;

        }

    }

   

    return 0;

}编译及执行过程和结果截屏:

4、编制一段程序,实现进程的管道通信。使用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:

            Child 1 is sending message!

            Child 2 is sending message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。(1分)

<参考程序>

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

int pid1,pid2;

main()

{   int fd[2];

    char OutPipe[100],InPipe[100];

    pipe(fd);

    while((pid1=fork())== -1);

    if(pid1==0)

    {   sprintf(OutPipe,"child 1 process is sending message!");

        write(fd[1],OutPipe,50);

        sleep(5);

        exit(0);

    }

    else

    {   while((pid2=fork())==-1);

        if(pid2==0)

        {   sprintf(OutPipe,"child 2 process is sending message!");

            write(fd[1],OutPipe,50);

            sleep(5);

            exit(0);

        }

        else

        {   wait(0);

            read(fd[0],InPipe,50);

            printf("%s\n",InPipe);

            wait(0);

            read(fd[0],InPipe,50);

            printf("%s\n",InPipe);

            exit(0);

        }

    }

}

编译及执行过程和运行结果截屏。

5、在父进程中用pipe()建立一条管道线,往管道里写信息,两个子进程接收父进程发送的信息。(2分)

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/wait.h>

#define BUFFER_SIZE 100

int main() {

    int fd[2]; // 创建一个包含两个文件描述符的数组,用于存放管道的读端和写端

    pid_t pid1, pid2; // 用于存放子进程的进程ID

    char buffer[BUFFER_SIZE];

    // 创建管道

    if (pipe(fd) == -1) {

        fprintf(stderr, "Pipe failed");

        return 1;

    }

    // 创建第一个子进程

    pid1 = fork();

    if (pid1 < 0) {

        fprintf(stderr, "Fork failed");

        return 1;

    } else if (pid1 == 0) {

        // 子进程1从管道中读取信息,并输出到屏幕上

        close(fd[1]); // 关闭写端

        read(fd[0], buffer, BUFFER_SIZE);

        printf("Child Process 1 received message: %s\n", buffer);

        close(fd[0]); // 关闭读端

        exit(0);

    } else {

        // 父进程继续执行创建第二个子进程

        pid2 = fork();

        if (pid2 < 0) {

            fprintf(stderr, "Fork failed");

            return 1;

        } else if (pid2 == 0) {

            // 子进程2从管道中读取信息,并输出到屏幕上

            close(fd[1]); // 关闭写端

            read(fd[0], buffer, BUFFER_SIZE);

            printf("Child Process 2 received message: %s\n", buffer);

            close(fd[0]); // 关闭读端

            exit(0);

        } else {

            // 父进程往管道中写入信息

            close(fd[0]); // 关闭读端

            char message[] = "Hello from Parent Process!";

            write(fd[1], message, strlen(message) + 1);

            close(fd[1]); // 关闭写端

            wait(NULL); // 等待第一个子进程结束

            wait(NULL); // 等待第二个子进程结束

        }

    }

    return 0;

}

编译及执行过程和运行结果截屏。

6、编程用管道实现父子进程间的双向通信。要求给出设计思路,调试通过的程序和编译执行过程以及结果截屏。(附加题)

设计思路:

  1. 使用pipe()函数在父进程和子进程之间创建两条管道线,一条用于父进程向子进程传递信息,另一条用于子进程向父进程传递信息。
  2. 父进程创建两个子进程,并分别在每个子进程中使用不同的文件描述符来读取和写入信息。
  3. 父进程通过管道向子进程发送信息,子进程通过管道向父进程发送信息。

代码:

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/wait.h>

#define BUFFER_SIZE 100

int main() {

    int fd1[2], fd2[2]; // 创建两个管道

    pid_t pid1, pid2; // 用于存放子进程的进程ID

    char buffer1[BUFFER_SIZE], buffer2[BUFFER_SIZE];

    // 创建第一个管道

    if (pipe(fd1) == -1) {

        fprintf(stderr, "Pipe1 failed");

        return 1;

    }

    // 创建第二个管道

    if (pipe(fd2) == -1) {

        fprintf(stderr, "Pipe2 failed");

        return 1;

    }

    // 创建第一个子进程

    pid1 = fork();

    if (pid1 < 0) {

        fprintf(stderr, "Fork1 failed");

        return 1;

    } else if (pid1 == 0) {

        // 子进程1从管道1中读取信息,并输出到屏幕上

        close(fd1[1]); // 关闭管道1写端

        read(fd1[0], buffer1, BUFFER_SIZE);

        printf("Child Process 1 received message: %s\n", buffer1);

        // 子进程1向管道2写入信息

        close(fd2[0]); // 关闭管道2读端

        char message1[] = "Message from Child Process 1";

        write(fd2[1], message1, strlen(message1) + 1);

        close(fd1[0]); // 关闭管道1读端

        close(fd2[1]); // 关闭管道2写端

        exit(0);

    } else {

        // 创建第二个子进程

        pid2 = fork();

        if (pid2 < 0) {

            fprintf(stderr, "Fork2 failed");

            return 1;

        } else if (pid2 == 0) {

            // 子进程2从管道2中读取信息,并输出到屏幕上

            close(fd2[1]); // 关闭管道2写端

            read(fd2[0], buffer2, BUFFER_SIZE);

            printf("Child Process 2 received message: %s\n", buffer2);

            // 子进程2向管道1写入信息

            close(fd1[0]); // 关闭管道1读端

            char message2[] = "Message from Child Process 2";

            write(fd1[1], message2, strlen(message2) + 1);

            close(fd2[0]); // 关闭管道2读端

            close(fd1[1]); // 关闭管道1写端

            exit(0);

        } else {

            // 父进程向管道1写入信息

            close(fd1[0]); // 关闭管道1读端

            char message[] = "Message from Parent Process";

            write(fd1[1], message, strlen(message) + 1);

            // 父进程从管道2中读取信息,并输出到屏幕上

            close(fd2[1]); // 关闭管道2写端

            read(fd2[0], buffer2, BUFFER_SIZE);

            printf("Parent Process received message: %s\n", buffer2);

            close(fd1[1]); // 关闭管道1写端

            close(fd2[0]); // 关闭管道2读端

            wait(NULL); // 等待子进程1结束

            wait(NULL); // 等待子进程2结束

        }

    }

    return 0;

}

编译及执行过程和运行结果截屏。

三、实验总结和体会(1分)

在进行操作系统进程间通信的实验中,我通过使用管道来实现父进程和子进程之间的双向通信。这个实验让我更深入地理解了进程间通信的概念和原理。

通过使用管道,我实现了父进程向子进程发送信息,并且子进程可以接收到并处理这些信息。同时,子进程也能向父进程发送信息,父进程能够接收并处理这些信息。这种双向通信的方式非常实用,可以在多个进程之间实现数据的传递和共享。

在实验过程中,我注意到了管道的读写顺序。如果读写的顺序不一致,会导致阻塞并无法正常进行通信。此外,我还发现了管道在父子进程之间的传递性,即父进程可以通过管道向子进程传递信息,子进程也可以通过管道向父进程传递信息。

通过这个实验,我不仅加深了对进程间通信的理解,还学会了如何使用管道来实现进程间的双向通信。这将对我未来的学习和工作有很大的帮助。同时也让我更加深入地理解了操作系统的原理和机制。

相关文章:

实验三 进程间通信实验

一、实验目的 1、了解什么是信号。 2、熟悉LINUX系统中进程之间软中断通信的基本原理。 3、理解进程的同步关系。 4、掌握用信号实现进程间的同步操作。 5、了解什么是管道。 6、熟悉UNIX/LINUX支持的管道通信方式。 二、实验内容 1、阅读下列程序&#xff0c;执行程序…...

NHANES指标推荐:TyG-WHtR

文章题目&#xff1a;Can cardiovascular health and its modifiable healthy lifestyle offset the increased risk of all-cause and cardiovascular deaths associated with insulin resistance? DOI&#xff1a;10.1186/s12933-025-02674-z 中文标题&#xff1a;心血管健康…...

Winddows11官网下载安装VMware Workstation Pro17(图文详解)

Winddows11安装VMware17 1、官网下载2、安装3、总结 1、官网下载 官网地址 点击Products&#xff0c;滑到最下面&#xff0c;选择SEE DESKTOPP HYPERVISORS 选择 DOWNLOAD FUSION OR WORKSTATION 自动跳转到下面哪个服界面&#xff0c;注册 输入邮箱地址和图片下面的文字…...

YOLO训练时到底需不需要使用权重

1. 预训练权重的作用与本质 预训练权重&#xff08;Pretrained Weights&#xff09;是在大规模数据集上训练得到的模型参数。这些权重能够学习通用的特征模式&#xff0c;如边缘、纹理、形状等&#xff0c;从而帮助模型更快收敛并提高泛化能力。YOLO提供的官方预训练权重通常基…...

2025最新软件测试面试八股文(答案+文档+视频讲解)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…...

SpringBoot整合AOP

没事做个Demo案例&#xff0c;首先看下项目结构&#xff1a; 第1步&#xff0c;导入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 第2步…...

第16章:MCP服务端项目开发实战:对话系统

第16章:MCP服务端项目开发实战:对话系统 对话系统,尤其是聊天机器人和虚拟助手,是 AI Agent 最广泛的应用领域之一。然而,传统的对话系统常常面临挑战,如难以维持长对话连贯性、缺乏个性化交互、无法有效利用对话中积累的知识等。MCP(Memory, Context, Planning)框架为…...

JavaScript 页面刷新:从传统到现代的全面解析

在 Web 开发中&#xff0c;"刷新"是一个基础但极其重要的功能。本文将全面探讨页面刷新的实现方式&#xff0c;从传统方法到现代最佳实践&#xff0c;深入解析每一种方案的原理和适用场景&#xff0c;并给出实用代码示例。 一、理解页面刷新的本质 在 Web 开发中&am…...

2025年Google Play审核策略全面解析

大家好&#xff0c;我是老妙&#xff0c;出海十余年的老司机&#xff0c;目前在死磕google play上架这一块。 目前来说&#xff0c;上架这一块不管是合规产品还是不合规产品&#xff0c;都建议使用有在架包的老号&#xff0c;更稳定&#xff0c;上架的审核时间更短&#xff0c…...

使用PHP对接印度尼西亚股票市场

在本篇文章中&#xff0c;我们将介绍如何使用PHP语言与StockTV API接口对接&#xff0c;获取并处理印度尼西亚&#xff08;Indonesia&#xff09;的股票市场数据。我们将以查询IPO信息和查看涨跌排行榜为例&#xff0c;展示具体的操作流程。 准备工作 首先&#xff0c;确保您…...

第54讲:总结与前沿展望——农业智能化的未来趋势与研究方向

目录 一、本板块内容回顾:人工智能助力农业的多元化应用 ✅ 精准农业与AI ✅ 农业金融与AI ✅ AI与农业政策 ✅ 农业物联网与AI 二、前沿趋势与研究方向:迈向智能、可持续农业的未来 1. AIGC(生成式AI)在农业中的应用 2. 数字孪生农业:虚拟与现实的无缝对接 3. A…...

Go语言中包导入下划线的作用解析

在Go语言的代码中&#xff0c;有时会看到类似以下的导入语句&#xff1a; import _ "github.com/mattn/go-sqlite3"这种以下划线_开头的导入方式&#xff0c;显得有些特别&#xff0c;尤其是对于新手来说&#xff0c;可能会感到困惑&#xff0c;为什么要这样写&…...

Linux学习笔记之动静态库

相信点进这篇帖子的你一定在动静态库的学习中遇到了很多问题。笔者由于曾经囫囵吞枣地学习库的相关知识&#xff0c;导致在实际应用中漏洞百出。所以写下这篇帖子&#xff0c;为大家解答一些疑惑&#xff0c;同时也加强自己的学习印象。 一、库的理解 什么是库&#xff1f;我…...

生成运算树

目录 题目题目描述示例输入输出算法标签: 二叉树, d f s dfs dfs, 模拟, *递归下降算法思路代码*后续 A C AC AC代码 题目 题目描述 在某种脚本语言里&#xff0c;有一个形如 x(api-xn)eps 的运算表达式&#xff0c;该表达式由以下元素构成&#xff1a; 操作数&#xff1a;…...

为什么要提出Null-text Inversion

在传统扩散模型的反转过程中&#xff08;如DDIM Inversion&#xff09;&#xff0c;文本提示&#xff08;Prompt&#xff09;确实不直接影响反转过程&#xff0c;但Null-text Inversion的优化动机源于反转-重建后的图像在后续编辑时对文本的依赖性。以下分步骤详细解释&#xf…...

centos离线安装ssh

一、在有网络的环境中准备RPM包 1.在一台与离线机器相同版本和架构的CentOS系统上&#xff0c;安装必要工具&#xff1a; sudo yum install -y yum-utils 2.创建目录存放RPM包&#xff1a; mkdir /tmp/ssh_rpms 3.下载SSH相关包及其依赖 yumdownloader --resolve --destd…...

数据库安装和升级和双主配置

备份和导入数据 ./mysqldump -u root -p123321 test > test.sql rsync -av test.sql root192.168.0.212:/usr/local/mysql/ ./mysql -uroot -p test < …/test.sql sudo tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ sudo ln -sfn /usr/loca…...

React 的 useEffect 清理函数详解

React 的 useEffect 清理函数详解 useEffect 是 React 中用于处理副作用&#xff08;side effects&#xff09;的 Hook&#xff0c;清理函数&#xff08;Cleanup Function&#xff09;是 useEffect 中返回的一个函数&#xff0c;用于清理或撤销副作用。清理函数的主要目的是确…...

C++ Lambda 表达式

Lambda 表达式的完整语法如下&#xff1a; [capture](parameters) mutable -> return_type { body }[capture]&#xff08;捕获列表&#xff09;&#xff1a;指定外部变量如何被 Lambda 表达式捕获&#xff08;按值或按引用&#xff09;。 (parameters)&#xff08;参数列…...

MATLAB 中的图形绘制

一、线图 plot 函数用来创建x和y值的简单线图。 x 0 : 0.05 : 30; %从0到30&#xff0c;每隔0.05取一次值 y sin(x); plot(x,y,LineWidth,2) %若&#xff08;x&#xff0c;y&#xff0c;LineWidth&#xff0c;2&#xff09;可变粗 xlabel("横轴标题") ylab…...

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目录 深度解析 Kubernetes 配置管理&#xff1a;如何安全使用 ConfigMap 和 Secret一、目录结构二、ConfigMap 和 Secret 的创建1. 创建 ConfigMapconfig/app-config.yaml&#xff1a;config/db-config.yaml&#xff1a; 2. 创建 Secretsecrets/db-credentials.yaml&#xff1a…...

【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建

本文章同步到我的个人博客网站&#xff1a;ElemenX-King&#xff1a;【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建 希望大家能使用此网站来进行浏览效果更佳&#xff01;&#xff01;&#xff01; 目录 一、异步FIFO1.1 异步FIFO的定义1.2 亚稳态1.3 异步FIFO关键技术…...

【含文档+PPT+源码】基于SpringBoot+Vue的移动台账管理系统

项目介绍 本课程演示的是一款 基于SpringBootVue的移动台账管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…...

C语言——函数

C语言——函数 函数的概念 函数&#xff1a;也叫子程序。C语言中的函数就是一个完成某项特定任务的一小段代码。C语言函数分类&#xff1a; 按照用户使用&#xff1a;库函数&#xff0c;自定义函数 按照参数的形式&#xff1a;无参函数&#xff0c;有参函数 按照是否有返回值…...

网络安全 | F5 WAF 黑白名单配置实践指南

关注&#xff1a;CodingTechWork 引言 在现代网络安全架构中&#xff0c;F5 Web Application Firewall (WAF) 是保护 Web 应用免受攻击的重要工具。F5 WAF 提供了强大的黑白名单功能&#xff0c;结合 Data Group 和 iRules&#xff0c;可以实现更灵活、更高效的流量控制策略。…...

黑马 redis面试篇笔记

redis主从 version: "3.2"services:r1:image: rediscontainer_name: r1network_mode: "host"entrypoint: ["redis-server", "--port", "7001"]r2:image: rediscontainer_name: r2network_mode: "host"entrypoint:…...

报错_NoSuchMethodException: cn.mvc.entity.User.<init>()

org.springframework.beans.BeanInstantiationException: Failed to instantiate [cn.mvc.entity.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: cn.mvc.entity.User.<init>() 添加一个无参的构造器即可&#xff01; pub…...

【无人机】无人机遥控器设置与校准,飞行模式的选择,无线电控制 (RC) 设置

目录 1、遥控器校准 1.1、校准步骤 2、飞行模式选择&#xff0c;遥控器通道映射 2.1、配置步骤 1、遥控器校准 在校准无线电系统之前&#xff0c;必须连接/绑定接收器和发射器。绑定发射器和接收器对的过程是特定于硬件的&#xff08;有关说明&#xff0c;请参阅 RC 手册&…...

基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案

一、核心硬件架构设计‌ ‌高性能算力引擎&#xff08;RK3588 处理器&#xff09;‌ ‌异构计算架构‌&#xff1a;集成 8 核 CPU&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;支持动态调频与多任务并行处理&#xff0c;单线程性能较传统四核方案…...

上岸率85%+,25西电先进材料与纳米科技学院(考研录取情况)

1、先进材料与纳米科技学院各个方向 2、先进材料与纳米科技学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、材料科学与工程25年相较于24年上升10分&#xff0c;为290分 2、材料与化工&#xff08;专硕&#xff09;25年相较于24年下降20分&#xff0c;为…...

10天学会嵌入式技术之51单片机-day-7

第十六章 UART通信 16.1 UART 概述 16.1.1 前置基础 想要理解和使用 UART&#xff0c;需要先了解一些通讯领域的术语&#xff0c;如下 。 &#xff08;1&#xff09;串行通讯和并行通讯 串行通讯和并行通讯是数据传输的两种主要方式&#xff0c;两者的区别如下。 &#xff…...

w~视觉~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327888 #几个论文 Fast Charging of Energy-dense Lithium-ion Batteries Real-time Short Video Recommendation on Mobile Devices Semantic interpretation for convolutional neural networks: What makes a ca…...

AI在论文评审中的应用与工具推荐

一、AI在论文评审中的核心应用场景 内容质量评估与逻辑校验 • 核心论点识别&#xff1a;AI可快速定位论文核心创新点&#xff0c;并验证其与文献综述、实验数据的逻辑一致性&#xff08;如知网研学的“文献矩阵分析”功能&#xff09;。 • 方法论合理性检测&#xff1a;自动识…...

怎样记忆Precision、Recall?

首先&#xff0c;明确符号&#xff1a; TP(True Posive)&#xff1a;标签为正&#xff0c;预测为正 TN(True Negative)&#xff1a;标签为负&#xff0c;预测为负 FP(False Positive)&#xff1a;标签为负&#xff0c;预测为正 FN(False Negative)&#xff1a;标签为正&#xf…...

【刷题】第三弹——二叉树篇(上)

文章目录 一.相同的树二. 另一棵树的子树三. 翻转二叉树四. 对称二叉树五. 平衡二叉树六. 二叉搜索树七. 二叉树的遍历 一.相同的树 检查两棵树是否相同 思路: 1.先比较结构 结构不一样直接false 2.结构一样,在比较值 public boolean isSameTree(TreeNode p, TreeNode q) {if…...

【Canvas与标志】红黄渐变阴影太极图

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>红黄渐变阴影太极图 Draft1&l…...

express的中间件,全局中间件,路由中间件,静态资源中间件以及使用注意事项 , 获取请求体数据

Express 中间件系统 的详细讲解&#xff0c;包括全局中间件、路由中间件、静态资源中间件、请求体解析中间件&#xff0c;以及使用注意事项&#x1f447; &#x1f310; 一、什么是中间件&#xff08;Middleware&#xff09;&#xff1f; 中间件是 函数&#xff0c;在请求到达…...

大数据去重

实验4 大数据去重 1.实验目的 通过Hadoop数据去重实验&#xff0c;学生可以掌握准备数据、伪分布式文件系统配置方法&#xff0c;以及在集成开发环境Eclipse中实现Hadoop数据去重方法。 2.实验要求 了解基于Hadoop处理平台的大数据去重过程&#xff0c;理解其主要功能&…...

高功率激光输出稳定性不足?OAS 光学软件来攻克

法布里珀罗干涉仪设计案例 简介 法布里珀罗干涉仪作为一种高分辨率光学仪器&#xff0c;基于多光束干涉原理构建。其核心结构由两块高度平行的反射镜组成谐振腔&#xff0c;当光进入该谐振腔后&#xff0c;会在镜面间进行多次反射。在这一过程中&#xff0c;透射光会形成干涉条…...

基于大模型的结肠癌全病程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、结肠癌概述 2.1 流行病学特征 2.2 发病机制与危险因素 2.3 临床症状与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用情况 3.3 在结肠癌预测中的潜力分析 四、术前…...

【Hive入门】Hive查询语言(DQL)完全指南:从基础查询到高级分析

目录 1 Hive查询执行架构全景 2 SELECT基础查询详解 2.1 基本查询结构 2.2 条件查询流程图 3 聚合函数与GROUP BY实战 3.1 聚合执行模型 3.2 GROUP BY数据流 4 排序操作深度解析 4.1 ORDER BY执行流程 4.2 排序算法对比 5 高级技巧与注意事项 5.1 嵌套查询与CTE 5.…...

【学习笔记】文件包含漏洞--相关习题

第一关 伪协议 用代码执行命令查看目录所含文件&#xff0c;发现flag.php 法一 题目代码含有include&#xff0c;写入文件包含指令&#xff1a; php://filter/readconvert.base64-encode/resourceflag.php 解码即可得到flag。 法二 法三 法二可以用php&#xff1a;//input&…...

蓝桥杯 20. 压缩变换

压缩变换 原题目链接 题目描述 小明最近在研究压缩算法。他知道&#xff0c;压缩时如果能够使数值很小&#xff0c;就能通过熵编码得到较高的压缩比。然而&#xff0c;要使数值变小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数序列&#xff0c;这些序列的特点是&a…...

BY免费空间去掉?i=1

BY免费空间去掉?i1 使用说明 支持域名&#xff1a;tae.dpdns.org 前提绑定主机&#xff0c;申请主机–控制面板选择–子域名&#xff0c;绑定xxx.tae.dpdns.org子域名 默认开启DDoS防御&#xff0c;无防火墙规则&#xff0c;建议用.htaccess来防御 默认去掉访问统计?i1 …...

中篇:深入剖析 L2CAP 与 ATT 协议模块(约5000字)

引言 在 BLE 协议栈中,L2CAP 与 ATT 承担了关键的数据分发、协议复用与属性访问职责。对多协议并存和大数据场景的应用,深入理解这两层协议的分片重组、流控机制、MTU/MTU 协商和 ATT 操作流程,对于提升系统性能与稳定性至关重要。本篇将全面拆解 L2CAP 与 ATT 的原理与实战…...

【C语言】C语言结构体:从基础到高级特性

前言 在C语言的世界里&#xff0c;结构体是一种强大而灵活的自定义数据类型&#xff0c;它能够将不同类型的数据组合在一起&#xff0c;形成一个逻辑上的整体。从简单的数据聚合到复杂的内存对齐优化&#xff0c;再到高效的位段操作&#xff0c;结构体在系统编程、嵌入式开发和…...

电控---JTAG协议

一、物理层架构与信号特性 1. 引脚定义与电气规范 核心引脚&#xff1a; TCK&#xff08;测试时钟&#xff09;&#xff1a;频率范围0.1MHz至50MHz&#xff08;如Xilinx Spartan-6支持25MHz&#xff09;&#xff0c;上升沿采样数据。TMS&#xff08;测试模式选择&#xff09;…...

FreeRTOS【3】任务调度算法

重要概念 在运行的任务&#xff0c;被称为"正在使用处理器"&#xff0c;它处于运行状态。在单处理系统中&#xff0c;任何时间里只能有一个任务处于运行状态。 非运行状态的任务&#xff0c;它处于这 3 中状态之一&#xff1a;阻塞(Blocked)、暂停(Suspended)、就绪…...

高德地图API + three.js + Vue3基础使用与使用 + 标记不显示避坑

three.js小白的学习之路。 最近闲来无事&#xff0c;突然想起来之前好像项目有需求说是要将模型放在地图上。加上在浏览别的大佬写的博客时&#xff0c;也找到了一些大佬写的相关文章。基本上都是使用的高德地图开放平台的JS API。我也随之开启了自己的学习之路。 先简单学习…...

书籍推荐:《价值心法》一姜胡说

书名 &#xff1a;《价值心法》一姜胡说 摘录 每天问问自己&#xff0c;如果今天只做一件事&#xff0c;这件事是什么&#xff1f;找到它。拿出2—3个小时&#xff0c;专门处理这件事。其他所有事全部排在那2—3个小时之外。 集中一段时间用来做最重要的事。这段时…...