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

Linux 信号signal处理机制

        Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。

         每个进程都会采用一个进程控制块对其进行描述,进程控制块中设计了一个signal的位图信息,其中的每位与具体的signal相对应,这与中断机制是保持一致的。当系统中一个进程A通过signal系统调用向进程B发送signal时,设置进程B的对应signal位图,类似于触发了signal对应中断。发送signal只是“中断”触发的一个过程,具体执行会在两个阶段发生:

1、  system call返回。进程B由于调用了system call后,从内核返回用户态时需要检查他拥有的signal位图信息表,此时是一个执行点。

2、  中断返回。进程被系统中断打断之后,系统将CPU交给进程时,需要检查即将执行进程所拥有的signal位图信息表,此时也是一个执行点。

        综上所述,signal的执行点可以理解成从内核态返回用户态时,在返回时,如果发现待执行进程存在被触发的signal,那么在离开内核态之后(也就是将CPU切换到用户模式),执行用户进程为该signal绑定的signal处理函数,从这一点上看,signal处理函数是在用户进程上下文中执行的。当执行完signal处理函数之后,再返回到用户进程被中断或者system call(软中断或者指令陷阱)打断的地方。

       Signal机制实现的比较灵活,用户进程由于中断或者system call陷入内核之后,将断点信息都保存到了堆栈中,在内核返回用户态时,如果存在被触发的signal,那么直接将待执行的signal处理函数push到堆栈中,在CPU切换到用户模式之后,直接pop堆栈就可以执行signal处理函数并且返回到用户进程了。Signal处理函数应用了进程上下文,并且应用实际的中断模拟了进程的软中断过程。

        最近写程序,各种bug各种错,有一回程序莫名退出,没报错,也没产生日志和core文件,貌似正常退出一样。

        但又不是在程序全部走完后退出,中途莫名退出,这就叫我想到了signal,应该是某些函数错误后发送kill信号给主进程,然后退出。

现在总结下signal各种类型:

Signal

Description

SIGABRT

由调用abort函数产生,进程非正常退出

SIGALRM

用alarm函数设置的timer超时或setitimer函数设置的interval timer超时

SIGBUS

某种特定的硬件异常,通常由内存访问引起

SIGCANCEL

由Solaris Thread Library内部使用,通常不会使用

SIGCHLD

进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略

SIGCONT

当被stop的进程恢复运行的时候,自动发送

SIGEMT

和实现相关的硬件异常

SIGFPE

数学相关的异常,如被0除,浮点溢出,等等

SIGFREEZE

Solaris专用,Hiberate或者Suspended时候发送

SIGHUP

发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送

SIGILL

非法指令异常

SIGINFO

BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程

SIGINT

由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程

SIGIO

异步IO事件

SIGIOT

实现相关的硬件异常,一般对应SIGABRT

SIGKILL

无法处理和忽略。中止某个进程

SIGLWP

由Solaris Thread Libray内部使用

SIGPIPE

在reader中止之后写Pipe的时候发送

SIGPOLL

当某个事件发送给Pollable Device的时候发送

SIGPROF

Setitimer指定的Profiling Interval Timer所产生

SIGPWR

和系统相关。和UPS相关。

SIGQUIT

输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程

SIGSEGV

非法内存访问

SIGSTKFLT

Linux专用,数学协处理器的栈异常

SIGSTOP

中止进程。无法处理和忽略。

SIGSYS

非法系统调用

SIGTERM

请求中止进程,kill命令缺省发送

SIGTHAW

Solaris专用,从Suspend恢复时候发送

SIGTRAP

实现相关的硬件异常。一般是调试异常

SIGTSTP

Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程

SIGTTIN

当Background Group的进程尝试读取Terminal的时候发送

SIGTTOU

当Background Group的进程尝试写Terminal的时候发送

SIGURG

当out-of-band data接收的时候可能发送

SIGUSR1

用户自定义signal 1

SIGUSR2

用户自定义signal 2

SIGVTALRM

setitimer函数设置的Virtual Interval Timer超时的时候

SIGWAITING

Solaris Thread Library内部实现专用

SIGWINCH

当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程

SIGXCPU

当CPU时间限制超时的时候

SIGXFSZ

进程超过文件大小限制

SIGXRES

Solaris专用,进程超过资源限制的时候发送

signal对应的值:

POSIX.1中列出的信号:

SIGHUP 1 A 终端挂起或者控制进程终止 
SIGINT 2 A 键盘中断(如break键被按下) 
SIGQUIT 3 C 键盘的退出键被按下 
SIGILL 4 C 非法指令 
SIGABRT 6 C 由abort(3)发出的退出指令 
SIGFPE 8 C 浮点异常 
SIGKILL 9 AEF Kill信号 
SIGSEGV 11 C 无效的内存引用 
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 
SIGALRM 14 A 由alarm(2)发出的信号 
SIGTERM 15 A 终止信号 
SIGUSR1 30,10,16 A 用户自定义信号1 
SIGUSR2 31,12,17 A 用户自定义信号2 
SIGCHLD 20,17,18 B 子进程结束信号 
SIGCONT 19,18,25 进程继续(曾被停止的进程) 
SIGSTOP 17,19,23 DEF 终止进程 
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 
SIGTTIN 21,21,26 D 后台进程企图从控制终端读 
SIGTTOU 22,22,27 D 后台进程企图从控制终端写 

没在POSIX.1中列出,而在SUSv2列出

SIGBUS 10,7,10 C 总线错误(错误的内存访问) 
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义 
SIGPROF 27,27,29 A Profiling定时器到 
SIGSYS 12,-,12 C 无效的系统调用 (SVID) 
SIGTRAP 5 C 跟踪/断点捕获 
SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD) 
SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD) 
SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD) 
SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD) 

(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。 

下面是其它的一些信号 

信号 值 处理动作 发出信号的原因 
---------------------------------------------------------------------- 
SIGIOT 6 C IO捕获指令,与SIGABRT同义 
SIGEMT 7,-,7 
SIGSTKFLT -,16,- A 协处理器堆栈错误 
SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD) 
SIGCLD -,-,18 A 与SIGCHLD同义 
SIGPWR 29,30,19 A 电源故障(System V) 
SIGINFO 29,-,- A 与SIGPWR同义 
SIGLOST -,-,- A 文件锁丢失 
SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun) 
SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS) 

(在这里,- 表示信号没有实现;有三个值给出的含义为,第一个值通常在Alpha和Sparc上有效,中间的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。) 

处理动作一项中的字母含义如下 
A 缺省的动作是终止进程 
B 缺省的动作是忽略此信号 
C 缺省的动作是终止进程并进行内核映像转储(dump core) 
D 缺省的动作是停止进程 
E 信号不能被捕获 
F 信号不能被忽略 

 代码示例:

#include<stdio.h>  
#include<signal.h>  
#include<unistd.h>  
#include<stdlib.h>  
void when_alarm();  
void when_sigint();  
void when_sigchld(int);  
void when_sigusr1();  
void when_sigio();  
int main()  
{  int childpid;//子程序进程ID号  printf("程序已经开始运行,5秒钟后将接收到时钟信号。/n");  if ((childpid=fork())>0)//父进程  {  signal(SIGALRM,when_alarm);  //当接收到SIGALRM信号时,调用when_alarm函数  signal(SIGINT,when_sigint);  //当接收到SIGINT信号时,调用when_sigint函数  signal(SIGCHLD,when_sigchld);//当接收到SIGCHLD信号时,调用when_sigchld函数  signal(SIGUSR1,when_sigusr1);//当接收到SIGUSR1信号时,调用when_sigusr1函数  signal(SIGIO,when_sigio);//当接收到SIGIO信号时,调用when_sigio函数  alarm(5);     //5秒钟之后产生SIGALRM信号  raise(SIGIO); //向自己发送一个SIGIO信号  pause(); //将父进程暂停下来,等待SIGALRM信号到来  pause(); //将父进程暂停下来,等待SIGUSR1信号到来  pause(); //将父进程暂停下来,等待SIGCHLD信号到来  printf("------此时程序会停下来等待,请按下ctrl+c送出SIGINT信号-------/n");  pause(); //将父进程暂停下来,等待SIGINT信号到来          }  else if(childpid==0) //子进程  {  int timer;  for(timer=7;timer>=0;timer--) //时钟计时5秒产生SIGALRM信号,再过2秒子进程退出,产生SIGCHLD信号  {  if(timer>2)      printf("距离SIGALRM信号到来还有%d秒。/n",timer-2);  if(timer==4)  kill(getppid(),SIGUSR1); //向父进程发送一个SIGUSR1信号  if((timer<=2)&&(timer>0))  printf("子进程还剩%d秒退出,届时会产生SIGCHLD信号。/n",timer);  if(timer==0) //子进程退出,产生SIGCHLD信号  raise(SIGKILL); //子进程给自己发一个结束信号  sleep(1); //每个循环延时1秒钟  }          }  else  printf("fork()函数调用出现错误!/n");  return 0;  
}  
void when_alarm()  
{  printf("5秒钟时间已到,系统接收到了SIGALRM信号!/n");  
}  
void when_sigint()  
{  printf("已经接收到了SIGINT信号,程序将退出!/n");  exit(0);  
}  
void when_sigchld(int SIGCHLD_num)  
{  printf("收到SIGCHLD信号,表明我的子进程已经中止,SIGCHLD信号的数值是:%d。/n",SIGCHLD_num);  
}  
void when_sigusr1()  
{  printf("系统接收到了用户自定义信号SIGUSR1。/n");  
}  
void when_sigio()  
{  printf("系统接收到了SIGIO信号。/n");  
}
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> void handle_alarm(int i) 
{ printf("SIGALRM num is %d\n",i);printf("handle_alarm is excuted\n");exit(0); 
} void ctl_c(int j){printf("control+c is excuted\n");printf("SIGINT signal num  is %d \n",j);}
int main(int argc, char *argv[]) 
{ signal(SIGALRM, &handle_alarm); signal(SIGINT,ctl_c);alarm(3); while(1) {} 
} 

运行结果:


void handle_alarm(int i) ,得到的 i 表示SIGALRM中断号14;
void ctl_c(int j) ,得到的j表示的是SIGINT中断号2

         用户自定义的信号处理函数,只能有一个或者无参数,不然会报错,例如下例所示:handle_alarm函数定义两个形参,编译时报错。

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> void handle_alarm(int i,int p) 
{ printf("SIGALRM num is %d\n",i);printf("p is %d \n",p);printf("handle_alarm is excuted\n");exit(0); 
} void ctl_c(int j){printf("control+c is excuted\n");printf("SIGINT signal num  is %d \n",j);}
int main(int argc, char *argv[]) 
{ signal(SIGALRM, &handle_alarm); signal(SIGINT,ctl_c);alarm(3); while(1) {} 
} 

相关文章:

Linux 信号signal处理机制

Signal机制在Linux中是一个非常常用的进程间通信机制&#xff0c;很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断&#xff0c;因此&#xff0c;在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进程…...

SpringBoot3之Web编程

标签&#xff1a;Rest.拦截器.swagger.测试; 一、简介 基于web包的依赖&#xff0c;SpringBoot可以快速启动一个web容器&#xff0c;简化项目的开发&#xff1b; 在web开发中又涉及如下几个功能点&#xff1a; 拦截器&#xff1a;可以让接口被访问之前&#xff0c;将请求拦截…...

策略模式(C++)

定义 定义一系列算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可互相替换((变化)。该模式使得算法可独立手使用它的客户程序稳定)而变化(扩展&#xff0c;子类化)。 ——《设计模式》GoF 使用场景 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多…...

【每日一题Day290】LC1281整数的各位积和之差 | 模拟

整数的各位积和之差【LC1281】 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 思路&#xff1a;简单模拟 循环取余&#xff0c;计算「各位数字之积」与「各位数字之和」&#xff0c;最后求差返回 实现 class Solution {public…...

揭示CTGAN的潜力:利用生成AI进行合成数据

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 我们都知道&#xff0c;GAN在生成非结构化合成数据&#xff08;如图像和文本&#xff09;方面越来越受欢迎。然而&#xff0c;在使用GAN生成合成表格数据方面所做的工作很少。合成数据具有许多好处&#x…...

GitHub中readme.md文件的编辑和使用

GitHub中readme.md文件的编辑和使用 | YuuiChungs BlogGitHub - guodongxiaren/README: README文件语法解读&#xff0c;即Github Flavored Markdown语法介绍...

Python 四舍五入到最接近的十位

本篇文章将讨论使用 Python 的 ceil() 函数将数字四舍五入到最接近的十。 Python 整数到最接近的十 Python 具有三个内置函数 round()、floor() 和 ceil()&#xff0c;可用于对数字进行舍入。 ceil() 函数属于数学模块&#xff0c;用于将浮点数舍入为大于或等于给定数字的最接…...

Unity限制在一个范围内移动

Unity限制在一个范围内移动 这个例子中&#xff0c;我们学习Vector3.ClampMagnitude的用法&#xff0c;限制小球在范围内移动。 在地图上放了一个小球&#xff0c;让他移动&#xff0c;但是不想让他掉下去&#xff0c;限制在一个球星范围内&#xff0c;就好像绳子拴住了一样&…...

dji uav建图导航系列(一)建图

文章目录 1、uav + rplidir雷达1.2、思岚激光雷达1.3、dji uav的launch文件2、cartographer激光建图2.1、启动文件2.2、config修改2.3、建图过程3、融合odom+laser建图1、uav + rplidir雷达 思岚激光雷达frame为base_laser_link, 无人机frame为base_footprint。 文件uav_lid…...

AAAI论文阅读

文章目录 Open-Vocabulary Multi-Label Classifcation via Multi-Modal Knowledge Transfer——知识蒸馏的范畴Med-EASi: Finely Annotated Dataset and Models for Controllable Simplifcation of Medical Texts——医学领域数据集构建“Nothing Abnormal”: Disambiguating M…...

填补5G物联一张网,美格智能快速推进RedCap商用落地

自5G R17版本标准冻结以来&#xff0c;RedCap一直引人注目。2023年更是5G RedCap突破性发展的一年&#xff0c;从首款5G RedCap调制解调器及射频系统——骁龙X35发布&#xff0c;到国内四大运营商发布RedCap技术白皮书&#xff0c;芯片厂商、模组厂商、运营商及终端企业都在积极…...

服务器杂七杂八的知识/常识归纳(不断更新)

一.pID与端口号不一样吗? pID&#xff08;Process ID&#xff0c;进程标识符&#xff09;和端口号是不同的概念。 pID是操作系统中用来唯一标识一个正在运行的进程的数字。每个正在运行的进程都会被分配一个唯一的pID&#xff0c;它可以用来追踪和管理进程。 而端口号是在网…...

掌握Java排序算法:实现主流排序方法与性能对比

一&#xff0c;C语言&#xff0c;主流的排序方法介绍 当谈论主流的排序方法时&#xff0c;通常指的是在实际应用中表现优秀且被广泛采用的排序算法。以下是常见的主流排序方法及其介绍、时间复杂度、空间复杂度和简单的C语言代码实现&#xff1a; 冒泡排序&#xff08;Bubble S…...

jdk17 SpringBoot JPA集成多数据库

switchRegion(切换地区)功能, 客户端可手动切换地区 , 查询不同的数据库, 后台根据地区切换数据库, 请求头添加region的key 配置类 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; im…...

vue 新学习 06 js的prototype ,export暴露,vue组件,一个重要的内置关系

01 在js中&#xff1a; 原型链 注意&#xff1a;构造函数.prototype实例化对象.__proto__&#xff0c;都是指向函数的原型。 export&#xff1a; -export用于对外输出本模块&#xff08;一个文件可以理解为一个模块&#xff09;变量的接口 -import用于在一个模块中加载另一个…...

冠达管理:“高温超导”不是“室温超导”,5天4板百利电气再次澄清

短短半个月&#xff0c;“室温超导”在惊喜、质疑间回转&#xff0c;但资本市场对“超导概念股”的炒作还在进行&#xff0c;8月7日室温超导概念持续疯涨。同花顺显现&#xff0c;到8月7日收盘&#xff0c;18只超导概念股中&#xff0c;有16只股票飘红。 广东研山私募证券投资&…...

CS 144 Lab Four 收尾 -- 网络交互全流程解析

CS 144 Lab Four 收尾 -- 网络交互全流程解析 引言Tun/Tap简介tcp_ipv4.cc文件配置信息初始化cs144实现的fd家族体系基于自定义fd体系进行数据读写的adapter适配器体系自定义socket体系自定义事件循环EventLoop模板类TCPSpongeSocket详解listen_and_accept方法_tcp_main方法_in…...

Linux面试专题

Linux面试专题 1 Linux中主要有哪几种内核锁?2 Linux 中的用户模式和内核模式是什么含意?3 怎样申请大块内核内存?4用户进程间通信主要哪几种方式?5通过伙伴系统申请内核内存的函数有哪些?6) Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)7) 对文件或设备的操作…...

MySQL错误日志(Error Log)详解

错误日志&#xff08;Error Log&#xff09;是 MySQL 中最常用的一种日志&#xff0c;主要记录 MySQL 服务器启动和停止过程中的信息、服务器在运行过程中发生的故障和异常情况等。 作为初学者&#xff0c;要学会利用错误日志来定位问题。下面介绍如何操作查看错误日志。 启动…...

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

一、前言 QLCDNumber类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础小部件。 QLCDNumber用来显示一个带有类似lcd数字的数字&#xff0c;适用于信号灯、跑步机、体温计、时钟、电表、水表、血压计等仪器类产品的数值显示。 QLCDNumber可以显示十进制…...

新版百度、百家号旋转验证码识别

昨天突然发现&#xff0c;百度旋转验证码发生了变化&#xff0c;导致使用老版本验证码训练出来的识别模型效果不佳。所有昨天花了一天时间完成了新版模型的训练。 老版本验证码 新版本验证码 新版的验证码感觉像是AI绘画随机生成的&#xff0c;还有随机阴影出现。 验证码识别…...

PMP考试每日一练(8月8日)

1、项目经理正在领导一个正在努力协作的多元文化团队。项目经理一开始将此视为团队建设的典型震荡阶段&#xff0c;但团队未能成功通过该阶段。结果&#xff0c;项目开始落后于进度。 项目经理在第一次发现这个问题时应该做哪两项工作&#xff1f;&#xff08;选两个&#xff0…...

机器学习实战1-kNN最近邻算法

文章目录 机器学习基础机器学习的关键术语 k-近邻算法&#xff08;KNN&#xff09;准备&#xff1a;使用python导入数据实施kNN分类算法示例&#xff1a;使用kNN改进约会网站的配对效果准备数据&#xff1a;从文本文件中解析数据分析数据准备数据&#xff1a;归一化数值测试算法…...

【eNSP】静态路由

【eNSP】静态路由 原理网关路由表 实验根据图片连接模块配置路由器设备R1R2R3R4 配置PC的IP地址、掩码、网关PC1PC2PC3 配置静态路由查看路由表R1R2R3R4测试能否通信 原理 网关 网关与路由器地址相同&#xff0c;一般路由地址为.1或.254。 网关是当电脑发送的数据的目标IP不在…...

算法训练Day42|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

背包类别 01背包&#xff1a;有n种物品&#xff0c;每种物品只有一个. 完全背包&#xff1a;有n种物品&#xff0c;每种物品有无限个. 多重背包&#xff1a;有n种物品&#xff0c;每种物品个数各不相同. 区别&#xff1a;仅仅体现在物品个数上的不同而已。 确定dp[i][j]数组的…...

HBase-组成

client 读写请求HMaster 管理元数据监控region是否需要进行负载均衡&#xff0c;故障转移和region的拆分RegionServer 负责数据cell的处理&#xff0c;例如写入数据put&#xff0c;查询数据get等 拆分合并Region的实际执行者&#xff0c;由Master监控&#xff0c;由regionServ…...

第一部分:领域中的基本概念

目录 一、什么是模型 二、什么是领域 三、什么是领域模型 四、什么是领域建模 一、什么是模型 模型是一种简化、它是对现实的解释&#xff0c;它与解决问题密切相关的方面抽象出来&#xff0c;而忽略无关细节。 二、什么是领域 领域是指某一专业或事物方面范围的涵盖。比如…...

react使用ref调用子组件的方法

Class类组件 import React, { useRef } from react;const MyComponent () > {const myComponentRef useRef(null);const handleClick () > {// 调用MyComponent组件的方法myComponentRef.current.myMethod();};return (<div><MyComponent ref{myComponentRe…...

JVM面试突击班2

JVM面试突击班2 对象被判定为不可达对象之后就“死”了吗 对象的生命周期 创建阶段 &#xff08;1&#xff09;为对象分配存储空间 &#xff08;2&#xff09;开始构造对象 &#xff08;3&#xff09;从超类到子类对static成员进行初始化 &#xff08;4&#xff09;超类成…...

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…...

做外语网站的公司/郑州seo推广

一、无卡支付 交易时需录入四要素完成支付&#xff0c;四要素包括&#xff1a;卡号、户名、身份证号、手机号&#xff0c;如果是信用卡还需要录入有效期和CVN&#xff0c;无卡支付平台一般的银行渠道还需要签约三方支付协议&#xff0c;具体取决于对接的银行或支付通道。 二、…...

北京网站开发网站建设浩森宇特/网站优化推广方案

原文:WPF使用异步绑定的方式处理大数据量WPF的优势在于界面处理&#xff0c;即使是这样&#xff0c;在面对大数据量的时候也免不了界面假死&#xff0c;同一个线程里处理界面跟大数据量&#xff0c;这是不可避免的。解决办法还是有的&#xff0c;可以使用分页加载&#xff0c;虚…...

做网站违反广告法/关键词优化报价推荐

一、理解什么是MyBatis&#xff1f; MyBatis 是支持普通 SQL 查询&#xff0c;存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射&#xff0c;将接口和 Java…...

织梦云建站系统/宁波品牌网站推广优化公司

[20160831]关于数据块Checksum.txt --以前我学习bbed时做过一些测试,将AAAA替换成BBBB,你可以发现数据块的Checksum并没有发生变化,当时并没有仔细探究, --现在想起来计算Checksum算法应该相对简单,就是做异或操作. --比如上面的字符AAAA如果2个字符按位做异或操作,变成0000000…...

wordpress新建html/江苏网站开发

项目需要对接另外两个公司的程序接口&#xff0c;其中一个公司使用纯C实现&#xff0c;一个使用C实现&#xff0c;我们需要把C的库封装给纯C的框架&#xff0c;C的库值提供了C的类头文件和自己的库&#xff0c;需要将C的部分包装为纯C调用方式&#xff0c;提供给外部 先看Makef…...

网站开发遵循/免费的外贸b2b网站

45.买股票的最佳时机 题目描述 假设你有一个数组&#xff0c;其中第\ i i 个元素是股票在第\ i i 天的价格。 你有一次买入和卖出的机会。&#xff08;只有买入了股票以后才能卖出&#xff09;。请你设计一个算法来计算可以获得的最大收益。 输入 [1,4,2]返回值 3输入 [2…...