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

Linux应用层学习——Day4(进程处理)

system

#include<stdio.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{//使用标准库函数创建子进程//int system (const char *__command);//const char *__command:使用linux命令直接创建一个子进程//return:成功返回0 失败返回失败编号int sysR = system("ping -c 100 www.mfjblog.top");if(sysR != 0){perror("system");//如果返回不为0则给出报错提示exit(EXIT_FAILURE);//然后退出}return 0;
}

Makefile

CC := gccsystem_test: system_test.c-$(CC) -o $@ $^-./$@-rm ./$@

在执行程序后,在另一个终端输入
ps -ef
然后查看进程的运行情况
这里看到执行的system_test是109063 创建的子进程 109064 其后面那个序号写的是父进程是109063
在这里插入图片描述

fork

进入fork的定义后,看到返回值只有一个pid号

__pid_t fork (void)

主进程 fork()返回新建的子进程ID
子进程fork()返回0
发生错误 返回-1
fork会返回两个值

在调用fork()函数前是一个进程在执行这段代码,而调用fork()函数后就变成了两个进程在执行这段代码。两个进程所执行的代码完全相同,都会执行接下来的语句块。

getpid

__pid_t getpid (void)

用getpid可以获取子进程号,在子进程中调用即可获取

getppid

__pid_t getppid (void)

getppid获取父进程号

综合示例

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(int argc, char const *argv[])
{/* code */// 调用fork之前 代码都在父进程中运行printf("老爷爷%d我来给你踩背啦\n",getpid());//fork不需要传参//fork返回两次:0表示子进程,非0表示父进程//子进程继承父进程的PID和GID//父进程返回子进程的PID//fork函数在创建子进程时,子进程和父进程完全相同//包括fork返回值,代码段,堆栈段,数据段,寄存器等//只有在fork返回0时,子进程才可以执行fork函数返回的语句//在fork返回非0时,父进程才可以执行fork函数返回的语句//-1代表出错pid_t pid = fork();//主进程 fork()返回新建的子进程ID 子进程fork()返回0if(pid < 0 ){printf("新学员加入失败\n");return 1;}else if (pid == 0)//fork返回0的时候,执行如下进程{/* code *///执行单独子进程代码printf("新学员%d加入成功,他是老学员%d推荐的\n",getpid(),getppid());//这里执行的getpid得到的是子进程的pid,后面getppid是得到父进程的pid}else{//执行单独父进程代码printf("老学员%d继续深造,他推荐了%d\n",getpid(),pid);//fork得到非0,所以这里getpid得到的是父进程的pid,pid在这里得到的是子进程的pid号}//printf("%d\n", pid);return 0;
}

文件描述符作用示例

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{int fd = open("io.txt",O_CREAT | O_WRONLY|O_APPEND,0644);if(fd == -1){perror("open");exit(EXIT_FAILURE);}char buffer[1024];pid_t pid = fork();if(pid < 0){perror("fork");exit(EXIT_FAILURE);}else if(pid ==0){//子进程代码strcpy(buffer,"这是子进程写入的数据\n");}else{//父进程代码sleep(1);strcpy(buffer,"这是父进程写入的数据\n");}//父子进程都要执行的代码ssize_t bytes_write = write(fd,buffer,strlen(buffer));if(bytes_write == -1){perror("write");close(fd);exit(EXIT_FAILURE);}close(fd);if(pid ==0){printf("子进程写入完毕。并释放文件描述符\n");}else{printf("父进程写入完毕。并释放文件描述符\n");}return 0;
}

子进程复制了父进程的文件描述符fd,二者指向的应是同一个底层文件描述(struct file结构体)。我们发现,子进程通过close()释放文件描述符之后,父进程对于相同的文件描述符执行write()操作仍然成功了。这是为什么?

struct file结构体中有一个属性为引用计数,记录的是与当前struct file绑定的文件描述符数量。close()系统调用的作用是将当前进程中的文件描述符和对应的struct file结构体解绑,使得引用计数减一。如果close()执行之后,引用计数变为0,则会释放struct file相关的所有资源。

execve

先写一个erlou程序

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{if(argc<2){printf("参数不够,不能上二楼\n");return 1;}printf("我是%s 编号%d父编号%d,我跟电棍上二楼啦\n",argv[1],getpid(),getppid());return 0;
}

execve

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{   //跳转之前char *name = "banzhang";printf("我是%s 编号%d,我现在还在一楼\n",name,getpid()); //跳转//int execve (const char *__path, char *const __argv[],char *const __envp[]) //const char *__path:执行程序的路径//char *const __argv[]:传入的参数 -》对应执行程序main方法的第2个参数///                     (1)第一个参数固定是程序的名称 -> 执行程序的路径(2)执行程序需要传入的参数//                      (3)最后一个参数一定是NULL        //char *const __envp[]:传递的环境变量//                      (1)环境变量参数: key=value PATH路径//                      (2)最后一个参数一定是NULL//return:若成功根本没法返回 失败返回-1//跳转前后只有进程号保留 别的变量都删除了char *args[] = {"/home/meng/Desktop/process_test/erlou",name,NULL};char *envs[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin",NULL};int re = execve(args[0],args,envs);if( re == -1){printf("你没有机会上二楼\n");return 1;}return 0;
}

在这里面,execve函数会去执行erlou
在这里插入图片描述

综合示例

erlou

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{if(argc<2){printf("参数不够,不能上二楼\n");return 1;}printf("我是%s 编号%d,父编号%d,我跟电棍上二楼啦\n",argv[1],getpid(),getppid());return 0;
}

fork_execev_test

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{//邀请之前char *name = "老学员";printf("%s %d继续在一楼精进\n",name,getpid());//邀请学员__pid_t pid = fork();if(pid == -1){printf("邀请新学员失败\n");return 1;}else if(pid == 0){//新学员在这里char *new_name = "小电棍";char *args[]={"/home/meng/Desktop/process_test/erlou",new_name,NULL};char *envs[] = {NULL}; int exR = execve(args[0],args,envs);if(exR == -1){printf("新学员上二楼失败\n");return 1;}}else {//老学员在这sleep(1);printf("老学员%d 邀请完%d 之后还是在一楼学习\n",getpid(),pid);}return 0;
}

这里的fork创建子进程,然后执行,调用execve函数去执行erlou程序
但是在执行的时候会发现erlou里面打印出来的父进程的编号是不对的

在这里插入图片描述
是因为在fork_execev_test中代码已经执行完毕了,所以父进程就先结束了,导出调用
getppid()无法得到父进程的编号,所以在最后那里给父进程加了一个sleep

waitpid

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{/* fork之前 */int subprocess_status;printf("老学员在校区\n");pid_t pid = fork();if(pid <0){perror("fork");}else if(pid == 0){//新学员char *args[]  ={"/usr/bin/ping","-c","10","www.baidu.com",NULL};char *envs[] = {NULL};printf("新学员联系电棍10次\n");int exR = execve(args[0],args,envs);if(exR < 0){perror("execve");return 1;}}else{//老学员printf("老学员%d等待新学员%d\n",getpid(),pid);waitpid(pid,&subprocess_status,0);}printf("老学员等待新学员联系完成\n");return 0;
}

如果在调用waitpid()函数时,当指定等待的子进程已经停止运行或结束了,则waitpid()会立即返回;但是如果子进程还没有停止运行或结束,则调用waitpid()函数的父进程则会被阻塞。

进程树

我们为了更直观的看到进程树,在c程序里面把进程用fgetc卡住

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{//邀请之前char *name = "老学员";printf("%s %d继续在一楼精进\n",name,getpid());//邀请学员__pid_t pid = fork();if(pid == -1){printf("邀请新学员失败\n");return 1;}else if(pid == 0){//新学员在这里char *new_name = "小电棍";char *args[]={"/home/meng/Desktop/process_test/erlou",new_name,NULL};char *envs[] = {NULL}; int exR = execve(args[0],args,envs);if(exR == -1){printf("新学员上二楼失败\n");return 1;}}else {//老学员在这printf("老学员%d 邀请完%d 之后还是在一楼学习\n",getpid(),pid);//永久挂起 等待输入任意一个字符停止char by = fgetc(stdin);}return 0;
}

然后在终端输入

ps -ef

重点是这几个进程
在这里插入图片描述
找到最上面makefile的父进程2545

在这里插入图片描述
可以看到是我们启动的vscode
其父进程2528,再找到其父进程的父进程,用此命令进行查找

ps -ef | grep 

在这里插入图片描述
可以看到其父进程是1709,我们用同样的方式继续查找
在这里插入图片描述
最后其父进程就是1了
这些带中括号的表示的是内核线程
在这里插入图片描述

孤儿进程

我们将子进程的代码改成睡眠100秒

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>int main(int argc, char const *argv[])
{if(argc<2){printf("参数不够,不能上二楼\n");return 1;}printf("我是%s 编号%d,父编号%d,我跟电棍上二楼啦\n",argv[1],getpid(),getppid());sleep(100);return 0;
}

然后在父进程结束之后,子进程就没有了父进程,成为了孤儿进程。在实际工程中要避免进程成为孤儿进程。

相关文章:

Linux应用层学习——Day4(进程处理)

system #include<stdio.h> #include<stdlib.h>int main(int argc, char const *argv[]) {//使用标准库函数创建子进程//int system (const char *__command);//const char *__command:使用linux命令直接创建一个子进程//return:成功返回0 失败返回失败编号int sys…...

起别名typedef

#include<stdio.h> //typedef int myType1; //typedef char myType2; typedef struct { int a; int b; }po; int main() { /*myType1 a5; myType2 bo; printf("%d\n",a); printf("%c\n",b);*/ po p;//不需要加struct关键…...

【Linux内核】ashmem pin/unpin

前言 在 Linux 内核的 ASHMEM&#xff08;Android Shared Memory&#xff09;实现中&#xff0c;pin 和 unpin 操作主要用于管理共享内存的生命周期和可用性。这些操作有助于确保在内存使用期间&#xff0c;特定的共享内存区域不会被回收或释放。 Pin 操作 定义 Pin 操作用…...

【docker】docker网络六种网络模式

Docker 网络模式总结 网络模式描述使用场景bridge默认的网络模式&#xff0c;容器之间通过虚拟网桥通信&#xff0c;容器与宿主机隔离。单机部署、本地开发、小型项目host容器与宿主机共享网络堆栈&#xff0c;容器直接使用宿主机的 IP 地址。高性能网络应用、日志处理、大量与…...

永磁同步电机谐波抑制算法(11)——基于矢量比例积分调节器(vector PI controller,VPI controller)的谐波抑制策略

1.前言 相比于传统的谐振调节器&#xff0c;矢量比例积分调节器&#xff08;vector PI controller&#xff0c;VPI controller&#xff09;多一个可调零点&#xff0c;能够实现电机模型的零极点对消。因此VPI调节器也被广泛应用于交流控制/谐波抑制中。 2.参考文献 [1] A. G…...

排序算法中稳定性的意义和作用

多关键字排序&#xff1a;当需要对数据进行多个关键字排序时&#xff0c;稳定性变得非常重要。例如&#xff0c;先按次要关键字排序&#xff0c;再按主要关键字排序。如果排序算法是稳定的&#xff0c;那么在按主要关键字排序后&#xff0c;次要关键字的顺序将被保留。保持关联…...

网站怎么防御https攻击

HTTPS攻击&#xff0c;它不仅威胁到网站的数据安全&#xff0c;还可能影响用户隐私和业务稳定运行。 HTTPS攻击主要分为以下几种类型&#xff1a; 1.SSL劫持&#xff1a;攻击者通过中间人攻击手段&#xff0c;篡改HTTPS流量&#xff0c;从而实现对数据的窃取或伪造。 2.中间人攻…...

gitignore 不起作用

.gitignore不起作用 文件已提交至远程仓库&#xff0c;已经被Git跟踪。清除缓存.gitignore位置可能不是与 .git隐藏文件夹同级目录。将文件移至同级目录缓存未清除 清除缓存 清楚git缓存步骤 进入项目路径 清除本地当前的Git缓存 git rm -r --cached . 应用.gitignore等本地…...

Hive学习基本概念

基本概念 hive是什么&#xff1f; Facebook 开源&#xff0c;用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…...

在 Ubuntu 使用 fonts-noto-cjk 设置 Matplotlib 支持中文的完整教程

在 Ubuntu 使用 fonts-noto-cjk 设置 Matplotlib 支持中文的完整教程 1. 为什么需要配置中文字体&#xff1f;2. 安装 fonts-noto-cjk安装命令&#xff1a;检查字体安装是否成功 3. 配置 Matplotlib 支持中文3.1 手动加载字体3.2 设置全局字体&#xff08;可选&#xff09;修改…...

《C++ Primer Plus》学习笔记|第10章 对象和类 (24-12-2更新)

文章目录 10.3 类的构造函数和析构函数10.3.2 使用构造函数显式地调用构造函数隐式地调用构造函数使用对象指针 10.3.3默认构造函数10.3.4 析构函数析构函数示例 10.4 this指针三个const的作用 10.5 对象数组10.6 类作用域10.9 复习题1.什么是类&#xff1f;2.类如何实现抽象、…...

SpringMVC接收数据

一、访问路径设置: RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来&#xff0c;建立映射关系;SpringMVC接收到指定的请求&#xff0c;就会来找到在映射关系中对应的方法来处理这个请求 1.精准路径匹配: 在RequestMapping注解指定URL地址…...

Python数组拆分(array_split())

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

Git 使用总结

下载 git bash&#xff1a;http://git-scm.com/download/win 第一次使用 git 时&#xff0c;配置用户信息&#xff1a; git config --global user.email "your.emailexample.com" 从github仓库中下载项目到本地&#xff0c;修改后重新上传&#xff1a; git clone 项…...

NaviveUI框架的使用 ——安装与引入(图标安装与引入)

文章目录 概述安装直接引入引入图标样式库 概述 &#x1f349;Naive UI 是一个轻量、现代化且易于使用的 Vue 3 UI 组件库&#xff0c;它提供了一组简洁、易用且功能强大的组件&#xff0c;旨在为开发者提供更高效的开发体验&#xff0c;特别是对于构建现代化的 web 应用程序。…...

YOLOv11 NCNN安卓部署

YOLOv11 NCNN安卓部署 之前自己在验证更换relu激活函数重新训练部署模型的时候&#xff0c;在使用ncnn代码推理验证效果很好&#xff0c;但是部署到安卓上cpu模式会出现大量的错误检测框&#xff0c;现已更换会官方默认的权重 前言 YOLOv11 NCNN安卓部署 目前的帧率可以稳定…...

多线程安全单例模式的传统解决方案与现代方法

在多线程环境中实现安全的单例模式时&#xff0c;传统的双重检查锁&#xff08;Double-Checked Locking&#xff09;方案和新型的std::once_flag与std::call_once机制是两种常见的实现方法。它们在实现机制、安全性和性能上有所不同。 1. 传统的双重检查锁方案 双重检查锁&am…...

golang debug调试

1. 本地调试 1&#xff1a;Add Configurations 添加配置文件&#xff08;Run kind &#xff1a;Directory&#xff09; 2&#xff1a;进入run运行窗口 3&#xff1a;debug断点调试模式 1. Resume Program (继续运行) 图标: ▶️ 或 ► 快捷键: F9&#xff08;Windows/Linux&a…...

安装 RabbitMQ 服务

安装 RabbitMQ 服务 一. RabbitMQ 需要依赖 Erlang/OTP 环境 (1) 先去 RabbitMQ 官网&#xff0c;查看 RabbitMQ 需要的 Erlang 支持&#xff1a;https://www.rabbitmq.com/ 进入官网&#xff0c;在 Docs -> Install and Upgrade -> Erlang Version Requirements (2) …...

pandas 大数据获取某列所有唯一值

目录 方法1: 方法2: 方法3 处理大数据: 方法1: data.groupby().groups.keys() import pandas as pd# 假设我们有以下的数据 data = {RTDR_name: [A, B, A, C, B, A],value: [1, 2, 3, 4, 5, 6] }# 创建 DataFrame temp_data = pd.DataFrame(data)# 获取 RTDR_name 列的…...

【AI系统】LLVM 架构设计和原理

LLVM 架构设计和原理 在上一篇文章中&#xff0c;我们详细探讨了 GCC 的编译过程和原理。然而&#xff0c;由于 GCC 存在代码耦合度高、难以进行独立操作以及庞大的代码量等缺点。正是由于对这些问题的意识&#xff0c;人们开始期待新一代编译器的出现。在本节&#xff0c;我们…...

Node.js 中的文件系统(fs)模块详解与代码示例

Node.js 中的文件系统&#xff08;fs&#xff09;模块详解与代码示例 Node.js 的 fs 模块提供了与文件系统交互的能力&#xff0c;包括文件的读写、目录的管理等。以下是 fs 模块中一些常用方法的详细解释和代码示例&#xff1a; 1. 异步读取文件内容 作用&#xff1a;异步读…...

TinyXML2的一些用法

TinyXML2 原始字符串字面量 TinyXML21. XML文档操作1.1 LoadFile(const char* filename)1.2SaveFile(const char* filename)1.3RootElement()1.4Parse(const char* xml) 2.元素操作2.1 FirstChildElement(const char* name nullptr)2.2 NextSiblingElement(const char* name …...

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…...

springboot370高校宣讲会管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 高校宣讲会管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c…...

navicat连接mysql 8.0以上版本2059错误

安装了最新版本8.0.4的mysql之后&#xff0c;使用navicat链接提示以下错误。原因是因为mysql8.0 之前的版本中加密规则是 mysql_native_password&#xff0c;而 mysql8.0 之后的版本加密规则是caching_sha2_password 处理方案 解决方案1&#xff1a;下载安装最新版本navicat…...

SQL优化与性能——C++与SQL性能优化

在开发高效的数据库应用程序时&#xff0c;性能优化至关重要&#xff0c;尤其是当系统规模逐渐扩大或并发请求增加时。数据库操作往往是应用程序性能的瓶颈所在&#xff0c;因此&#xff0c;在 C 应用程序中合理优化数据库操作&#xff0c;管理数据库连接池、使用批量插入与更新…...

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下AI高中数学教学视频生成技术&#xff1a;利用通义千问、MathGPT、视频多模态大模型&#xff0c;语音大模型&#xff0c;将4个模型融合 &#xff0c;生成高中数学教学视频&#xff0c;并给出实施方案。本文利用专家模…...

vscode远程连接ssh

一. 使用vscode里的ssh查件连不上远程的解决方法 删除Windows上的known_host文件&#xff0c;该文件会在连接之后自动生成&#xff0c;用于验证远程服务器的身份。 konwn_host和id_rsa&#xff0c;id_rsa.pub的关系 &#xff08;1&#xff09;konwn_host用于客户端验证远程服务…...

学习ASP.NET Core的身份认证(基于Session的身份认证2)

基于Session的身份认证通过后&#xff0c;后续访问控制器的函数时该如何控制访问权限&#xff1f;虽然可以按上篇文章方式在需要做控制的函数开头检查Session的用户标识&#xff0c;可以写个全局通用检查类供所需函数调用&#xff0c;但还是有更简便的方法&#xff0c;本文学习…...

深度学习基本单元结构与输入输出维度解析

深度学习基本单元结构与输入输出维度解析 在深度学习领域&#xff0c;模型的设计和结构是理解其性能和应用的关键。本文将介绍深度学习中的基本单元结构&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、反卷积&#xff08;转置卷积&#xff09;、循环神经网络&…...

playwright 学习复仇记-1 开端

前言 说到 web 自动化&#xff0c;大家最熟悉的就是 selenium 了&#xff0c;selenium 之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe&#xff0c; 但这3个都需要掌握 JavaScript 语言&#xff0c;所以只是少部分人在用。 2020年微软开源一个 UI 自动化测试工具 Pl…...

从零开始使用GOT-OCR2.0——多模态OCR项目:微调数据集构建 + 训练(解决训练报错,成功实验微调训练)

在上一篇文章记录了GOT-OCR项目的环境配置和基于官方模型参数的基础使用。环境安装的博文快速链接&#xff1a; 从零开始使用GOT-OCR2.0——多模态通用型OCR&#xff08;非常具有潜力的开源OCR项目&#xff09;&#xff1a;项目环境安装配置 测试使用-CSDN博客 本章在环境配置…...

Rust学习笔记_10——守卫

Rust学习笔记_07——枚举和范围 Rust学习笔记_08——String Rust学习笔记_09——模式匹配 守卫 文章目录 守卫1. 介绍2. 基本用法3. 示例4. 复杂用法5. if let5.1 基本用法5.2 示例5.3 守卫与if let的区别与联系 1. 介绍 在Rust中&#xff0c;守卫&#xff08;guard&#xff…...

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下&#xff1a; UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…...

如何打开链接中的网址

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了包管理相关的内容,本章回中将介绍如何使用url_launcher包.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍url_launcher包主要用来打开Url中的内容,Url可以是电话号码,网址,邮箱等内容。如…...

React 前端框架4

六、React 中的事件处理 &#xff08;一&#xff09;绑定事件的方式 在 React 中&#xff0c;事件绑定和传统的 HTML 中的事件绑定有一些不同&#xff0c;它采用了驼峰命名法来命名事件名称&#xff0c;并且事件绑定的属性值是一个函数。例如&#xff0c;在 HTML 中绑定点击事…...

Neo4j启动时指定JDK版本

项目使用jdk1.8&#xff0c;同时需要安装neo4j5.15版本&#xff0c;使用jdk17. 1.mac或者liunx&#xff0c;找到neo4j目录bin的下neo4j文件 设置JAVA_HOME: 2.windows,找到bin下面的neo4j.bat文件 set "JAVA_HOME{JDK文件目录}" 重启后生效。...

【k8s深入理解之 Scheme 补充-2】理解 register.go 暴露的 AddToScheme 函数

AddToScheme 函数 AddToScheme 就是为了对外暴露&#xff0c;方便别人调用&#xff0c;将当前Group组的信息注册到其 Scheme 中&#xff0c;以便了解该 Group 组的数据结构&#xff0c;用于后续处理 项目版本用途使用场景k8s.io/apiV1注册资源某一外部版本数据结构&#xff0…...

TextBlob:简单高效的自然语言处理工具

TextBlob&#xff1a;简单高效的自然语言处理工具 TextBlob 是一个基于 NLTK 和 Pattern 的自然语言处理库&#xff0c;以简单易用著称。它提供了直观的 API&#xff0c;支持文本分析、情感分析、拼写纠正等常见任务&#xff0c;非常适合快速原型开发和学习。 为什么选择 Text…...

QT:将QTableWidget内容写入txt文件中

文章详请&#xff1a;最近在做手在眼上的标定&#xff0c;首先要采集机械臂数据和图像数据&#xff0c;我使用tablewidget进行机械臂数据的显示&#xff0c;最后的计算需要将机械臂位姿数据存储在txt文件中。 引用&#xff1a;Qt如何保存tableWidget数据&#xff1f;_qt table…...

每日十题八股-2024年12月2日

1.你知道有哪个框架用到NIO了吗&#xff1f; 2.有一个学生类&#xff0c;想按照分数排序&#xff0c;再按学号排序&#xff0c;应该怎么做&#xff1f; 3.Native方法解释一下 4.数组与集合区别&#xff0c;用过哪些&#xff1f; 5.说说Java中的集合&#xff1f; 6.Java中的线程…...

R语言森林生态系统结构、功能与稳定性分析与可视化实践高级应用

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...

RDMA驱动学习(三)- cq的创建

用户通过ibv_create_cq接口创建完成队列&#xff0c;函数原型和常见用法如下&#xff0c;本节以该用法为例看下cq的创建过程。 struct ibv_cq *ibv_create_cq(struct ibv_context *context, int cqe,void *cq_context,struct ibv_comp_channel *channel,int comp_vector); cq …...

Python-使用类和实例-Sun-Mon

9.2.1 Car类 class Car():"""概述车辆信息"""def __init__(self,make,model,year):"""初始化参数"""self.makemakeself.modelmodelself.yearyear //__init__方法会把依据Car类创建的实例传入的实参的值&#xff…...

【MIT-OS6.S081笔记0.5】xv6 gdb调试环境搭建

补充一下xv6 gdb调试环境的搭建&#xff0c;我这里装的是最新的15.2的gdb的版本。我下载的是下面的第二个xz后缀的文件&#xff1a; 配置最详细的步骤可以参考下面的文章&#xff1a; [MIT 6.S081] Lab 0: 实验配置, 调试及测试 这里记录一下踩过的一些报错&#xff1a; 文…...

vmware虚拟机移植

最近发现虚拟机的系统非常适合移植&#xff0c;接下来看一下具体的过程 复制vmdk 第一个重要的文件是保存vmdk&#xff0c;如果磁盘使用的是多个文件则最好进行合并一下&#xff08;用着用着会发现vmdk文件特别大&#xff0c;这是正常的&#xff0c;不要想着能压缩了&#xf…...

最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff…...

活着就好20241202

亲爱的朋友们&#xff0c;大家早上好&#xff01;今天是2024年12月2日&#xff0c;第49周的第一天&#xff0c;也是十二月的第二天&#xff0c;农历甲辰[龙]年十月三十。在这个全新月份的开始、阳光初升的清晨&#xff0c;愿第一缕阳光悄悄探进你的房间&#xff0c;带给你满满的…...

Scala的练习题(成绩计算)

//1.迭代器&#xff0c;跳过第一个元素 //2.把字符串转成数字 //3.如何判断一个正整数是否可以被三整除&#xff1f; &#xff08;123&#xff09; % 3 0 import wyyyy.Studentimport scala.collection.mutable.ListBuffer import scala.io.Sourcecase class Student(name: St…...