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

简单shell

目录

预备知识

fork

进程等待

wait

waitpid

环境变量

概念

分类

常见的环境变量及其用途

环境变量的查看与设置

exec系列

 函数解释

命名理解

简单shell


预备知识

fork

fork 是 Linux 和许多其他类 Unix 系统中的一个重要系统调用,它用于创建一个新的进程,这个新进程是当前进程的复制品,称为子进程。子进程会获得父进程当前状态的副本,包括父进程的内存布局、环境变量、打开的文件描述符等。但是,子进程和父进程是两个独立的执行线程,它们可以独立地运行程序的不同部分。

以下是关于 fork 的一些关键点:

  1. 复制:子进程是父进程的一个副本。但是,这种复制是“写时复制”(Copy-On-Write, COW)的。这意味着,如果子进程和父进程都不修改它们共享的内存区域,那么这些区域实际上不会被复制,从而节省内存和 CPU 时间。
  2. 返回值fork 系统调用在父进程中返回新创建的子进程的进程 ID(PID),而在子进程中返回 0。这是区分父进程和子进程的一个常用方法。
  3. 资源分配:子进程会获得其父进程所拥有资源的副本,如文件描述符、环境变量等。但是,这些资源并不一定是物理上独立的;它们通常是通过引用计数或其他机制来共享的。
  4. 并发:由于子进程和父进程是两个独立的执行线程,因此它们可以并发地执行不同的任务。这使得 fork 成为实现多进程并发和并行处理的重要工具。
  5. 进程间通信:由于子进程和父进程是独立的,因此它们之间需要进行通信以共享数据或协调行为。这可以通过各种进程间通信(IPC)机制来实现,如管道、消息队列、信号量、共享内存等。
  6. 终止和等待:当子进程终止时,它会留下一个僵尸进程(Zombie Process),直到其父进程调用 wait 或 waitpid 系统调用来获取其终止状态并释放其占用的资源。

需要注意的是,虽然 fork 是一个强大的工具,但它也有一些限制和开销。例如,由于需要复制父进程的状态,因此 fork 的开销通常比创建线程要大。此外,由于子进程和父进程是独立的,因此它们之间的通信和同步也需要额外的开销和复杂性。因此,在选择使用 fork 还是其他并发机制(如线程或协程)时,需要根据具体的应用场景和需求进行权衡。

进程等待

wait

  • 功能wait函数用于使父进程等待其任意一个子进程结束,并回收该子进程的资源。当子进程结束时,内核会向父进程发送SIGCHLD信号,父进程可以通过wait函数来响应这个信号并获取子进程的状态。
  • 函数原型pid_t wait(int *wstatus);
    • 参数wstatus是一个指向整数的指针,用于存储子进程的退出状态。如果父进程不关心子进程的退出状态,可以将此参数设为NULL。
    • 返回值是已结束子进程的进程ID(PID),如果出现错误则返回-1。
  • 特点wait函数会阻塞父进程的执行,直到有一个子进程结束。如果调用wait时子进程已经结束,则wait会立即返回子进程的结束状态值。

waitpid

  • 函数原型:#include #include pid_t wait(int*status); 返回值: 成功返回被等待进程pid,失败返回-1
  • 返回值:
    • 当正常返回的时候waitpid返回收集到的子进程的进程ID;
    • 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
    • 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
  • 参数:
    • pid:
      • Pid=-1,等待任一个子进程。与wait等效。
      • Pid>0.等待其进程ID与pid相等的子进程。
    • status:
      • WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
      • WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
    • options:
      • WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进 程的ID。

环境变量

概念

  • 定义:环境变量是系统预定义的参数,相当于全局变量,存在于所有的shell中,具有继承性。它们可存储有关shell会话和工作环境的信息。
  • 作用:环境变量允许在内存中存储数据,以便运行在shell上的程序和脚本访问。这些数据可以用来识别用户、系统、Shell的特性以及任何其它需要存储的数据。

分类

  • 按作用范围分
    • 系统环境变量:公共的,对全部的用户都生效。
    • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
  • 按生存周期分
    • 永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
    • 临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

常见的环境变量及其用途

  • PATH:指定命令的搜索路径,由冒号分隔的目录列表,用于告诉系统在哪里可以找到可执行文件。
  • HOME:指定用户的主工作目录,即用户登录到Linux系统时,默认的目录。
  • SHELL:当前Shell的路径,通常指向用户当前使用的shell解析器,如/bin/bash
  • LD_LIBRARY_PATH:C/C++语言动态链接库文件搜索的目录,对C/C++程序员来说非常重要。
  • CLASSPATH:JAVA语言库文件搜索的目录,对JAVA程序员来说非常重要。

环境变量的查看与设置

  • 查看
    • 使用env命令可以查看当前用户全部的环境变量。
    • 使用echo $环境变量名可以查看特定环境变量的值。
  • 设置
    • 使用export命令可以设置新的环境变量或修改现有环境变量的值。例如,export PATH=$PATH:/new/directory
    • 如果希望环境变量永久生效,需要在登录脚本文件中(如/etc/profile/etc/profile.d/~/.bash_profile~/.bashrc等)进行配置

exec系列

#include <unistd.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

nt execle(const char *path, const char *arg, ...,char *const envp[]);

int execv(const char *path, char *const argv[]); i

nt execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

这些函数的主要目的是在当前进程的上下文中执行一个新程序,从而替换当前进程的映像。它们允许程序在运行时加载新的可执行文件,实现动态性和灵活性。

 函数解释

  • 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
  • 如果调用出错则返回-1
  • 所以exec函数只有出错的返回值而没有成功的返回值

命名理解

  • l(list) : 表示参数采用列表
  •  v(vector) : 参数用数组
  • p(path) : 有p自动搜索环境变量PATH
  • e(env) : 表示自己维护环境变量

简单shell

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#define SIZE 512
#define ZERO '\0'
#define SEP " "
#define NUM 32
#define SkipPath(p) do{p+=strlen(p)-1;while(*p!='/')p--;}while(0)
#define SkipSpace(cmd,pos) do{ \while(1){\if(isspace(cmd[pos]))\pos++;\else break;\}}while(0)
#define none_type 0
#define in_type 1
#define out_type 2
#define app_type 3
int redir_type=none_type;
char* filename=NULL;char* gArgv[NUM];
int lastcode=0;
void Die()
{exit(1);
}
const char* GetHostname()
{const char* hostname=getenv("HOSTNAME");if(hostname==NULL)return "/";return hostname;
}
const char* GetUsername()
{const char* user=getenv("USER");if(user==NULL)return "none";return user;
}
const char* Getcwd()
{const char* cwd=getenv("PWD");if(cwd==NULL) return "none";return cwd;
}
void MakeCommmandLine()
{char line[SIZE];const char* hostname=GetHostname();const char* username=GetUsername();const char* cwd=Getcwd();SkipPath(cwd);snprintf(line,sizeof(line),"[%s@%s %s]> ",username,hostname,strlen(cwd)==1?"/":cwd+1);printf("%s",line);fflush(stdout);
}
int GetUserCommad(char commad[],size_t n)
{char* s=fgets(commad,n,stdin);if(s==NULL)return -1;commad[strlen(commad)-1]=ZERO;return strlen(commad);}
void CheckRedir(char cmd[])
{int pos=0;int end=strlen(cmd);while(pos<end){if(cmd[pos]=='>'){if(cmd[pos+1]=='>'){cmd[pos++]=0;pos++;redir_type=app_type;SkipSpace(cmd,pos);filename=cmd+pos;}else {cmd[pos++]=0;redir_type=out_type;SkipSpace(cmd,pos);filename=cmd+pos;  }}else if(cmd[pos]=='<'){cmd[pos++]=0;redir_type=in_type;SkipSpace(cmd,pos);filename=cmd+pos;}else{pos++;}}
}
void SplitCommad(char command[])
{gArgv[0]=strtok(command,SEP);int index=1;while((gArgv[index++]=strtok(NULL,SEP)));
}
void ExecuteCommand()
{pid_t id=fork();if(id<0)Die();else if (id==0){//子进程if(filename!=NULL){if(redir_type==in_type){int fd=open(filename,O_RDONLY);dup2(fd,0);}else if (redir_type==out_type){int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);dup2(fd, 1); }else if (redir_type==app_type){int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0666);dup2(fd, 1);}}execvp(gArgv[0],gArgv);exit(errno);}else{//父进程int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid > 0){lastcode = WEXITSTATUS(status);if(lastcode != 0) printf("%s:%s:%d\n", gArgv[0], strerror(lastcode), lastcode);} }
}
int main()
{int quit=0;while(!quit){redir_type=none_type;filename=NULL;//创建一个自己的命令行MakeCommmandLine();//获取用户命令char usercommad[SIZE];int n=GetUserCommad(usercommad,sizeof(usercommad));if(n<=0)return 1;CheckRedir(usercommad);//测试一下//   printf("cmd: %s\n", usercommad);//   printf("redir: %d\n", redir_type);//   printf("filename: %s\n", filename);//分割字符串SplitCommad(usercommad);//执行命令ExecuteCommand();}return 0;
}

相关文章:

简单shell

目录 预备知识 fork 进程等待 wait waitpid 环境变量 概念 分类 常见的环境变量及其用途 环境变量的查看与设置 exec系列 函数解释 命名理解 简单shell 预备知识 fork fork 是 Linux 和许多其他类 Unix 系统中的一个重要系统调用&#xff0c;它用于创建一个新的…...

Spring Boot + FreeMarker 实现动态Word文档导出

Spring Boot FreeMarker 实现动态Word文档导出 在现代企业应用中&#xff0c;文档自动化生成是一项提升工作效率的重要功能。Spring Boot与FreeMarker的组合&#xff0c;为开发者提供了一个强大的平台&#xff0c;可以轻松实现动态Word文档的导出。本文将指导你如何使用Sprin…...

3D生物打印的未来:多材料技术的突破

多材料生物打印技术是近年来发展迅速的一项技术&#xff0c;为组织工程和再生医学带来了新的机遇&#xff0c;可以帮助我们更好地理解人体组织的结构和功能&#xff0c;并开发新的治疗方法。 1. 组织构建 复杂性模拟&#xff1a;多材料生物打印技术能够构建具有层次结构和异质…...

充电宝口碑哪个好?好用充电宝品牌有哪些?好用充电宝推荐

充电宝作为我们日常生活和出行的重要伙伴&#xff0c;其品质和性能直接影响着我们的使用体验。今天&#xff0c;就来和大家探讨一下充电宝口碑哪个好&#xff0c;为大家盘点那些备受赞誉的好用充电宝品牌&#xff0c;并向您推荐几款值得入手的充电宝&#xff0c;外出时不再担心…...

Pytorch-----(6)

一 、问题 如何计算基于不同变量的操作如矩阵乘法。 二、具体实现 0.4版本以前&#xff0c;张量是包裹在变量之中的&#xff0c;后者有三个属性grad、volatile和 requires_grad属性。&#xff08;grad 就是梯度属性&#xff0c;requires_grad属性就是 是否需要存储梯度&#x…...

leetcode hot100 第三题:最长连续序列(Java)

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…...

利用Jaspar进行转录因子结合位点预测

前期我们介绍了如何进行ChIP-qPCR验证&#xff0c;里面提到了一个比较重要的因素——扩增范围的选择及引物的设计。相比双荧光素酶、酵母单杂-点对点验证等允许完整启动子验证的实验&#xff0c;ChIP-qPCR要求单次验证的范围尽量控制在150-200bp内。但一个基因的启动子一般有2-…...

Ubuntu添加系统字体

&#xff08;2024.6.30&#xff09; 系统字体保存路径在/usr/share/fonts下&#xff0c;如果此目录下缺少字体&#xff0c;则使用其他可视化api&#xff08;如Python的pygame库&#xff09;的默认配置时可能会出现乱码问题。 往Ubuntu中添加字体的方法 方法一&#xff1a;手…...

深度学习相关概念及术语总结2

目录 76.AUC77.DBSCAN聚类78.贝叶斯个性化排序79.BPRBandit算法 76.AUC AUC&#xff08;Area Under the Curve&#xff09;是一种常用的评价指标&#xff0c;用于衡量分类模型的性能。AUC值代表了模型在不同阈值下的真阳性率&#xff08;True Positive Rate&#xff09;和假阳…...

基于改进滑模、经典滑模、最优滑模控制的永磁同步电机调速系统MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 针对永磁同步电机调速系统的响应性能和抗干扰能力问题&#xff0c;本文做了四个仿真&#xff0c;分别为&#xff1a;永磁同步电机的PID控制调速系统、基于传统滑模控制的永磁同步电机的调速系统、最…...

windows环境下创建python虚拟环境

windows环境下创建python虚拟环境 使用virtualenv库创建虚拟环境&#xff0c;可使不同的项目处于不同的环境中 安装方法&#xff1a; pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua…...

Fragment切换没变化?解决办法在这里

大家好&#xff0c;今天跟大家分享下如何避免fragment切换失败。方法其实很简单&#xff0c;只要在onCreate方法中初始化一个默认的fragment即可。 //开始事务FragmentTransaction transaction getActivity().getSupportFragmentManager().beginTransaction();transaction.rep…...

Linux系统防火墙iptables(下)

备份与还原iptables规则设置 1、yum -y install iptables iptables-services 安装iptables软件包 2、systemctl start iptables.service 开启服务 3、systemctl enable iptables.service 开机自启 我们对iptables命令行中的设置&#xff0c;都是临时设置&#xff0c;只要遇到服…...

你需要精益管理咨询公司的N+1个理由

近年来&#xff0c;精益管理作为一种被全球众多知名企业验证过的成功管理模式&#xff0c;越来越受到企业的青睐。但是&#xff0c;为何在实施精益管理的过程中&#xff0c;众多企业纷纷选择请咨询公司来协助呢&#xff1f;今天&#xff0c;我们就来一起揭秘这背后的原因。 1. …...

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络&#xff08;Neural Networks, NNs&#xff09;是机器学习的一种重要方法&#xff0c;灵感来源于生物神经系统&#xff0c;由大量互联的节点&#xff08;称为神经元或单元&#xff09;组成&#xff0c;通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统…...

网络安全等级保护2.0(等保2.0)全面解析

一、等保2.0的定义和背景 网络安全等级保护2.0&#xff08;简称“等保2.0”&#xff09;是我国网络安全领域的基本制度、基本策略、基本方法。它是在《中华人民共和国网络安全法》指导下&#xff0c;对我国网络安全等级保护制度进行的重大升级。等保2.0的发布与实施&#xff0c…...

用Lobe Chat部署本地化, 搭建AI聊天机器人

Lobe Chat可以关联多个模型&#xff0c;可以调用外部OpenAI, gemini,通义千问等, 也可以关联内部本地大模型Ollama, 可以当作聊天对话框消息框来集成使用 安装方法参考&#xff1a; https://github.com/lobehub/lobe-chat https://lobehub.com/zh/docs/self-hosting/platform/…...

基于ARM的通用的Qt移植思路

文章目录 实验环境介绍一、确认Qt版本二、确认交叉编译工具链三、配置Qt3.1、修改qmake.conf3.2、创建autoConfig.sh配置文件 四、编译安装Qt五、移植Qt安装目录六、配置Qt creator6.1、配置qmake6.2、配置GCC编译器6.3、配置G编译器6.4、配置编译器套件6.5、创建应用 七、总结…...

IT专业入门,高考假期预习指南

七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。 一、基础课程预习指南 IT专业是一个广泛的领域&#xff0c;涵盖了从软件开…...

芯片详解——AD7606C

芯片详解——AD7606C AD7607C 是一款由 Analog Devices(模拟器件公司)生产的 6 通道同步采样模数转换器(ADC),适用于高速数据采集系统。 工作原理 AD7607C 的工作原理主要包括以下几个步骤: 模拟信号输入:AD7607C 有六个模拟输入通道,可以同时进行采样。这些模拟信号…...

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件&#xff0c;点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…...

人工智能业务分析

人工智能业务分析的组成图 #mermaid-svg-SKV0WrbMSANzQz4U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SKV0WrbMSANzQz4U .error-icon{fill:#552222;}#mermaid-svg-SKV0WrbMSANzQz4U .error-text{fill:#552222;s…...

随机文本生成器

目录 开头程序程序的流程图程序打印的效果(不必细看&#xff0c;因为字符太多)例1例2例3 结尾 开头 大家好&#xff0c;我叫这是我58。看&#xff01;这下面有一个程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <random> #includ…...

java中输入输出流的继承关系

在 Java 中,输入输出流的继承关系主要围绕两个抽象基类展开:字节流基类 InputStream 和 OutputStream,以及字符流基类 Reader 和 Writer。这些类形成了 Java I/O 系统的基础,提供了丰富的子类以适应不同的输入输出需求。 字节流 字节流用于处理原始的二进制数据。 Input…...

c++应用网络编程之一基本介绍

一、网络编程介绍 c编程的应用场景在前面分析过&#xff0c;一个重要的方向就是网络编程。一般来说&#xff0c;开发者说的服务端编程在c方向上简单的可以认为是网络编程。首先需要说明的&#xff0c;本系列不对网络编程的相关基础知识展开详细的说明&#xff0c;因为这种知识…...

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…...

Java 位运算详解

位运算是一种直接在二进制位上进行操作的方式。位运算符包括按位与 (&)、按位或 (|)、按位异或 (^)、按位非 (~)、左移 (<<)、右移 (>>) 和无符号右移 (>>>)。这些操作符用于操作整型数据类型&#xff0c;如 int 和 long。 一、按位与 (&) 按位…...

智能体实战:开发一个集成国内AI平台的GPTs,自媒体高效智能助手

文章目录 一&#xff0c;什么是GPTs二&#xff0c;开发GPTs1&#xff0c;目标2&#xff0c;开发2.1 打开 GPTS&#xff1a;https://chat.openai.com/gpts2.2 点击 Create 创建一个自己的智能体 2.3 配置GPTs2.4 配置外挂工具2.4.1 配置Authentication-授权2.4.1.1 生成语聚AI的…...

完美世界|单机版合集(共22个版本)

前言 我是研究单机的老罗&#xff0c;今天给大家带来的是完美世界的单机版合集&#xff0c;一共22个版本。本人亲自测试了一个版本&#xff0c;运行视频如下&#xff1a; 完美世界|单机版合集 先看所有的版本的文件&#xff0c;文件比较大&#xff0c;准备好空间&#xff0c;差…...

Jenkins的一些记录

设置环境变量 在 Jenkins 流水线中&#xff0c;取决于使用的是声明式还是脚本式流水线&#xff0c;设置环境变量的方法不同。 声明式流水线支持 environment 指令&#xff0c;而脚本式流水线的使用者必须使用 withEnv 步骤。 pipeline {agent anyenvironment { CC clang}stag…...

讲讲js中的prototype和__proto__

在Javascript中&#xff0c;prototype和__proto__是两个重要的概念&#xff0c;在对象的原型链中扮演重要的角色。 prototype prototype是js函数的内置属性&#xff0c;每个函数都有一个prototype属性&#xff0c;它是一个指针&#xff0c;指向一个对象&#xff08;原型对象&a…...

JavaScript的学习之DOM的查询(一)

一、获得元素 通过document对象调用&#xff1a; getElementById()&#xff1a;通过id属性获取一个元素节点对象getElementsByTagName()&#xff1a;通过标签名获取一组元素节点对象getElementsByName()&#xff1a;通过name属性来获取一组元素节点对象 核心学习代码 <scrip…...

充电宝哪个品牌比较好一点?多维度实测西圣、绿联、倍思充电宝!

在这个快节奏的时代&#xff0c;智能手机已成为我们日常生活不可或缺的一部分&#xff0c;而充电宝作为其能量补给站&#xff0c;重要性不言而喻。面对市场上琳琅满目的充电宝品牌与型号&#xff0c;如何挑选一款既实用又高效的充电伴侣&#xff0c;成为了许多消费者的难题。今…...

ubuntu安装QT

以QT5.15.14为例 下载地址&#xff1a;Index of /archive/qt 安装步骤&#xff1a; 解压qt-everywhere-src-5.15.14运行&#xff1a; cd qt-everywhere-src-5.15.14 mkdir build cd build ../configure -prefix /opt/qt5.15.14 -opensource -confirm-license make -j16 sudo…...

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…...

《C++ Primer》导学系列:第 13 章 - 拷贝控制

13.1 拷贝、赋值与析构函数 拷贝控制是C++中类设计的重要组成部分,用于管理对象的复制、赋值和销毁过程。理解并正确实现拷贝控制函数(拷贝构造函数、拷贝赋值运算符和析构函数)对于编写健壮和高效的C++程序至关重要。 13.1.1 拷贝构造函数 拷贝构造函数用于创建对象的副…...

c++ 图论2 深度优先算法和广度优先算法

修改一下深度优先算法和广度优先算法&#xff0c;标出每一个节点相对于遍历起始位置的层级&#xff0c;遍历起始起点为第一层&#xff0c;和第一层相连的节点为第二层&#xff0c;以此类推 定义一个新的结构 struct NodeWithLevel {TreeNode* node;int level;NodeWithLevel(T…...

【Qt】初识QtQt Creator

一.简述Qt 1.什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…...

Android 11.0 修改系统显示大小导航栏消失

Android 11.0 修改系统显示大小导航栏消失 1.显示大小设置为大时&#xff0c;导航栏图标不显示。 设置为大&#xff0c;较大&#xff0c;最大时&#xff0c;导航栏图标不显示。 2.开始怀疑是导航栏被隐藏了&#xff0c;各种折腾无效。 3.发现&#xff1a; frameworks/base/pa…...

RocketMQ源码学习笔记:Producer启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview1.1、创建MQClientInstance1.1.1、检查1.1.1、MQClientInstance的ID 1.2、MQClientInstance.start() 1、Overview 这是发送信息的代码样例&#xff0c; DefaultMQProducer produ…...

Node.js 和浏览器环境中都使用 WebSocket

使用WebSocket为什么不适配双端 浏览器环境本身就支持 WebSocket&#xff0c;直接使用 JavaScript 内置的 WebSocket 对象来建立连接。 Node中本身并没有内置 WebSocket 协议的支持&#xff0c;所以需要使用第三方库 ws来实现 WebSocket 功能。 一. 使用跨平台 WebSocket 库 …...

css美化滚动条样式

效果展示 实现 滚动条宽&#xff0c;高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…...

由浅入深,走进深度学习(补充篇:转置卷积和FCN)

本期内容是针对神经网络层结构的一个补充&#xff0c;主要内容是&#xff1a;转置卷积和全连接卷积网络 相关内容&#xff1a; 由浅入深&#xff0c;走进深度学习&#xff08;2&#xff09;_卷积层-CSDN博客 由浅入深&#xff0c;走进深度学习&#xff08;补充篇&#xff1a…...

Linux基础篇——目录结构

基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"/"&#xff0c;然后在根目录下再创建其他的目录 在Linux中&#xff0c;有一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件 Linux中根目录下的目录 具体的…...

星际编码:Swifter.Json,.NET宇宙中的数据处理新星

概述 在数字化的星辰大海中&#xff0c;数据是宇宙的通用语言。在.NET这一广袤的星系中&#xff0c;JSON作为信息交换的媒介&#xff0c;扮演着至关重要的角色。今天&#xff0c;我们要探索的是一颗新星——Swifter.Json&#xff0c;一个功能全面且性能卓越的JSON序列化和反序列…...

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…...

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示问题修复 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息&#xff0c;k8s: 1.27.x&#xff0c;nacos: 2.0.3。运行环境为 centos 7…...

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。 答案&#xff1a;错误 2.(neuDS)在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。 答案&#xff1a;正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不…...

树莓派挂载的移动硬盘badblocks坏道屏蔽,以这个为准

!!!use 这里要设置块大小和磁盘相同 badblocks -b 4096 -s -c 512 -v -o /a/2/bads4.txt /dev/sda5 检测完重新检测跳过之前的记录 badblocks -i /a/2/bads4.txt -b 4096 -s -c 512 -v -o /a/2/bads5.txt /dev/sda5 可以查看磁盘具体block总数和大小 sudo dumpe2fs /dev/sda5 …...

Unity开箱即用的UGUI面板的拖拽移动功能

文章目录 &#x1f449;一、背景&#x1f449;二、效果图&#x1f449;三、原理&#x1f449;四、核心代码&#x1f449;五&#xff0c;总结 &#x1f449;一、背景 之前做PC项目时常常有面板拖拽移动的需求&#xff0c;今天总结封装一下&#xff0c;做成一个随时随地可复用的…...

【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?

优化深层次View层次结构的问题&#xff0c;选择合适的布局方式是至关重要的。以下是几点建议&#xff1a; 使用ConstraintLayout&#xff1a;ConstraintLayout是Android开发中推荐的布局&#xff0c;能够有效减少嵌套&#xff0c;提高布局性能。相比RelativeLayout&#xff0c;…...

Selenium 库

Selenium两大对象 WebDriver对象 页面跳转截图获取源码执行js最大化窗口切换窗口 WebElement对象 输入点击获取内容获取属性改变样式 鼠标和键盘操作 鼠标 左键单击右键单击左键双击右键双击中键单击、双击滚动长按拖动 按键&#xff1a; ASCII功能键编辑键快捷键 快…...

python—面向对象

面向对象概述 Python面向对象编程&#xff08;OOP&#xff09;是一种程序设计方法&#xff0c;它将数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;封装成对象&#xff0c;并通过类来定义这些对象。面向对象编程的核心概念包括封装、继承和多态。下面将详…...

如何实现在短信链接中直接打开微信小程序

你是否有过这样的体验&#xff0c;收到一条短信&#xff0c;里面有一个链接&#xff0c;点击后就直接打开了微信&#xff0c;并且进入了一个小程序。这种神奇的功能是如何实现的呢&#xff1f;本文将为你揭晓答案。 利用微信URL Link 接口生成链接 要实现短信中的链接直接打开…...

归并排序——有序序列的合并

目录 1、简述 2、复杂度 3、稳定性 4、例子 1、简述 有序序列的合并&#xff08;Merge of Sorted Sequences&#xff09;是归并排序的核心步骤之一。其目的是将两个已经排序的序列合并成一个新的有序序列。这个过程在归并排序中非常重要&#xff0c;因为归并排序通过递归地…...

德国Testing Expo丨落幕不散场!知迪展台风采回顾

德国斯图加特国际展览中心&#xff0c;随着全球汽车产业的目光聚焦&#xff0c;Automotive Testing Expo Europe 2024圆满落幕。在这场汇聚了全球顶尖汽车测试技术的盛会中&#xff0c;知迪科技凭借卓越的技术实力和前瞻性的解决方案&#xff0c;成为了现场诸多专业观众的瞩目焦…...

20万买合资B级车,英仕派对比凯美瑞,究竟谁更胜一筹?

提到合资B级车,丰田凯美瑞往往是选车清单上绕不开的车型。不管是市场销量还是关注热度,凯美瑞用实力证明它才是这个级别市场的常青树。随着市场竞争更加激烈,比凯美瑞更优秀的车型不断涌现。就拿这辆东风本田英仕派燃油版来说,它除了有着一套好看的外观颜值以外,还有着不错…...

安全与智能完美联合,问界新M5通过易车主动安全测试

随着汽车技术的不断完善,如今新能源汽车市场竞争更加激烈。各大车企也更重视汽车安全性层面的打造。在5月30日,由易车推出的《易起鏖战》节目正式上线,节目中也通过实测方式,针对问界新M5、特斯拉Model Y和理想L6这三款行业代表作进行了主动安全的测试。结果可想而知,问界…...

马斯克:若苹果在操作系统层面集成OpenAI,我将禁止苹果设备进入我的公

文|编辑部整理 编辑|大风马斯克:若苹果在操作系统层面集成OpenAI,我将禁止苹果设备进入我的公司马斯克表示,如果苹果与OpenAI合作,在操作系统层面整合ChatGPT,我将禁止那些携带苹果设备的人来访。届时,访客将需要在公司大门口接受针对苹果设备的设备检查。马斯克提及,“…...

于AI对话 --如何更好的使用AI工具

文章目录 于AI对话 --如何更好的使用AI工具1、认识AI工具&#xff1a;2、对话原则&#xff1a;3、提问步骤&#xff1a;4、AI可以学习什么&#xff1f;5、提问技巧&#xff1a;1、提出假设性问题:2、&#xff08;鼓励引导式提问&#xff09;跨学科思考:举个例子&#xff1a; 3、…...

Spring Boot集成rss快速入门demo

1.什么是rss&#xff1f; RSS 的全称是「简易内容聚合」&#xff08;Really Simple Syndication&#xff09;&#xff0c;是一个能让你在一个地方订阅各种感兴趣网站的工具。 一个网站支持 RSS&#xff0c;就意味着每当它新发布一篇新文章&#xff0c;就会往一个位于特定网址的…...

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面&#xff0c;感觉可以用 SQL 表达的&#xff0c;没有必要用 Java/Scala 去写&#xff0c;但是面试一段时间后&#xff0c;发现不少公司还是在用 SparkSQL 的&#xff0c;京东也在使用 Spark On Hive 而不是我以为的 Hive O…...