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

Linux->进程终止和等待

目录

1. 进程终止场景

1.1 进程退出码

1.2 进程常见退出方式

 2. 进程等待

2.1 进程等待的必要性

2.2 进程等待的方式

wait()方式

waitpid()方式

options参数

status参数


1. 进程终止场景

代码运行完毕,结果正确
代码运行完毕,结果不正确
代码异常终止

         进程终止也就是我们通常理解的进程退出了,但是我们又怎样理解上面的三句话呢?什么叫做代码运行完毕结果正确或者不正确?难道是我们每一次都需要自己去调试?有或则是每一个都需要通过IO接口,将程序结果调试出来然后在判断程序是否正确?答案很明显不是的,往下将会给你结果。

1.1 进程退出码

        首先,咱们得明白一个概念,判断是一个代码运行完毕结果是否正确,肯定不会是我们之前所想的那样,将程序以printf、cout或者调试的方法用认为的方式判断是否正确,因为对于计算机而言,我们判断是否正确根本没有意义,因为它的运行速度太快了,如果有其它进程需要这个进程的退出信息,难道它会等我们告知一个答案吗?不会的。所以编程语言出现了——进程退出码

        大家第一次看到进程退出码可能会认为这是一个很厉害,很牛逼的东西,其实不是,我们平时练习C语言和C++时都有用到它,只是大伙不知道到底是干嘛的罢了。如下:

 int main()
 {
      return 0;                                                                                                                  
 } 

        上方代码的0就是进程退出码之一,表示程序正确执行,是否感到了一丝丝无语伙伴们,是不是以为是什么呢?哈哈。不过无语归无语,这个知识点却是很多知识点的桥梁,还是得认真了解的。

        0表示程序执行完了结果正确,其余数字都表示结果不正确,为什么?就因为C语言规定了?这玩意你不说谁会懂?我举一个例子:

        假如你和你女朋友说话,你女朋友问你“你爱不爱我”,你说“0”,然后你女朋友就觉得莫名其妙,然后再问你“你是不是有病?我问你话呢”,然后你又回了“3”,你女朋友气不过,她认为你在耍她,最后就气跑了。你冤不冤枉,你有好好回答哇,只是她不懂哇。

        上面这个故事就表明了,我不管你是啥,我问你东西,你就必须得用我知道的方式来回答,否则我生气,然后把你踢了。所以对于计算机而言,我们就是这个女朋友,他需要用我们知道的方式来回答,所以string.h库中有一个strerror函数,可以将我们的进程退出码的信息以文字方式表示出来。如下:

  1 #include<stdio.h>  2 #include<stdlib.h>  3 #include<sys/types.h>  4 #include<string.h>  5 #include<unistd.h>  6 7 int main()8 {9   int i = 0;10   for(i = 0;i<130;++i)11   {12     printf("我的进程退出码是:%d,退出信息是:%s\n",i,strerror(i));13   }14 15   return 0;16 }

         上述为进程退出码的部分信息,可以看到0的退出信息是Success,我没骗人吧。我相信大家好好看一下是能看出某些信息自己在写Linux时是看到过的,比如说退出码2,退出码13。我以退出码为例,如下:

         看到了没?知识串起来了,以前只是听过Linux是用C语言写的,但是不知道是怎么写的,但是这里有没有感觉?

1.2 进程常见退出方式

1. 从main返回
2. 调用exit
3. _exit

         进程退出从main返回的意思就是通过return返回,注意,只有main函数的返回值才被称为进程退出,其它函数的return只是表示这个函数的功能结束了,并带回了一个返回值,接收到这个返回值的地方依旧是这个进程。

        而我们的exit和_exit函数则没有这个限制了,它们能够在任意函数结束进程,使用方法如下:

exit("退出码");

_exit("退出码");

        这样看起来,好像exit函数和_exit函数没有什么区别呢? 

        在大多数情况下,这两个函数并没有什么区别,但是还是有一定的区别的,请先看下图:

         区别就是_exit是一个系统接口,而exit是stdio.h库提供的一个库函数,并且exit函数内部调用的_exit函数,且exit函数调用没有_exit函数暴力,它会先将前面执行的代码运行完了才结束进程,而_exit会直接退出进程,不管缓冲区的数据等

 int main()                                                                                                        
 {
      printf("hello world");
      exit(0);                                                                                                                                   }   

int main()

{

        printf("hello world");
        _exit(0);     
}

 exit();运行结果:

 _exit()运行结果:

 2. 进程等待

        进程等待一般出现在父子进程之间,父进程等待子进程运行完毕,父进程在执行自己的代码。一般是在网络通信连接时有用。

2.1 进程等待的必要性

1. 子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
2. 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
3. 最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
4. 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

         上述的概念已经为我们清晰的解释了进程等待的必要性,关于僵尸进程就是子进程退出,但是父进程没有对它的资源做回收,也就是获取进程退出信息,那么子进程的进程状态就会变为Z,并且一直保持这个状态,没有谁能干掉它,它就一直占用系统资源

2.2 进程等待的方式

wait()方式

        wait()是一个在sys/wait.h库里面的函数,函数声明为:

pid_t wait(int*status);

         返回值正确为被等待进程pid,不正确为-1,status参数为输出型参数,当我们不关心子进程的退出状态,那么就可以将其设置能为NULL。如下:

代码:

  1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/wait.h>4 #include<sys/types.h>5 #include<stdlib.h>6 7 void test1()8 {9   int cnt = 5;10   while(1)11   {12     printf("我是子进程,我还能活%dS\n",cnt);13     sleep(1);14     --cnt;15     if(cnt == 0)16       exit(110);17   }18 }19 20 21 int main()22 {23   pid_t id = fork();24   if(id == 0)25   {                                                                                                                          26     test1();27   }28   pid_t subid = wait(NULL);29   printf("我是父进程,我等待子进程%d完毕\n",subid);30 31   return 0;32 }

结果:

         从代码中能够看到父进程的printf语句在子进程被执行完毕之后才执行了,也就表示父进程使用wait函数之后确实处于等待状态,也回收了子进程的信息,因为wait返回了正确的pid。

waitpid()方式

        waitpid()是在sys/types.h库和sys/wait.h库中的函数,声明为:

pid_t waitpid(pid_t pid, int *status, int options);

返回值:
当正常返回的时候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。

        该函数的使用方式和wait函数基本一致,但是它的参数options、和两个函数都有的status输出型参数我需要为大家讲解一下。

options参数

        当我们将其输入为0时,此时函数的功能就是进程等待模式,也就是上述图中的模式,但是如果我们将其输入为WNOHANG,那么函数的功能就会变为轮询式等待,什么意思呢,先看代码:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/wait.h>4 #include<sys/types.h>5 #include<stdlib.h>6 7 void test1()8 {9   int cnt = 5;10   while(1)11   {12       printf("我是子进程,我还能活%dS\n",cnt);13     sleep(1);14     --cnt;15     if(cnt == 0)16       exit(110);17   }18 }19 20 21 int main()22 {23   pid_t id = fork();24   if(id == 0)25   {                                                                                                                        26     test1();27   }28   int status = 0;29   pid_t subid = waitpid(id,&status,WNOHANG);30   printf("我是父进程,我不想等子进程了,先运行了,之后在回收资源\n");31   return 0;32 }

         上图中可以看出,我们通过WNOHANG参数,父进程就没有等到子进程执行完了再执行代码,而是先运行着自己的代码,子进程自己跑。我将一个故事,大家大概就能懂了。

        小明和小芳是一对好朋友,一天小明想要邀请小芳一起出去玩,然后呢,他就打电话给小芳问她现在能不能出去?小芳说:等等我,我在洗澡呢,小明说:好,我等你,电话别挂。然后电话就一直打着,15分钟后,小芳说:我好了。然后挂断了电话,小明和小芳就一起出去了。——————进程等待

         还是小明和小芳,同样小明想要邀请小芳出去玩,小芳也还在洗澡,小明打电话问:还在洗吗?小芳说:嗯。然后电话挂了,小明洗了个脸,大概一分钟又问:还在洗?小芳说:嗯。如此循环,直到小芳说出洗完了,才不会继续打电话问了。——————轮询式等待

         上述的两个故事就对应了我们进程的等待方式。小明就是父进程、小芳就是子进程。

status参数

         什么叫做输出型参数呢?输出型参数就是指,我们只需要传一个地址进入就行,然后其它函数拿到这一个空间,对其进行数值修改,在原函数就能拿到这个值了。

        status是一个整型变量,他也是一个位图,意思就是他用一个变量存了进程退出码和异常信息的值,它的高16位没有被使用,次高8位用于存进程退出码,低7位用于存异常信息,还有第8位用于存core dump信息。如下:

printf("我是父进程,子进程的退出码为%d,异常信息为%d\n",(status>>8)&0xFF,status&0x7F);  

        该方式就是我们的位图,使用方式就是位运算。 

        值得一提的是,当子进程有一个错误,那么就不会有退出码,也就是说——程序无异常->程序执行是否正确

n /= 0;   错误语句

         程序崩溃,子进程没有成功运行,退出码为0,异常信息为8。


        以上就是我对进程终止和进程等待的全部理解了,还请大家多多支持哇,谢谢。

相关文章:

Linux->进程终止和等待

目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 waitpid()方式 options参数 status参数 1. 进程终止场景 代码运行完毕&#xff0c;结果正确 代码运行完毕&#xff0c;结果不正确 代码异…...

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…...

2022 第十四届蓝桥杯模拟赛第三期(题解与标程)

第十四届蓝桥杯模拟赛第三期1. 最小的十六进制问题描述答案提交参考答案2. Excel的列问题描述答案提交参考答案3. 相等日期问题描述答案提交参考答案4. 多少种取法问题描述答案提交参考答案5. 最大连通分块问题描述答案提交参考答案6. 哪一天问题描述输入格式输出格式样例输入样…...

「TCG 规范解读」PC 平台相关规范(1)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

HNU工训中心:直流电路测量分析实验报告

工训中心的牛马实验 实验目的 1.熟悉直流电路的测量和分析方法。 2.熟悉直流电源、电压表、电流表的使用法及其特性。 实验仪器和器材 1.实验仪器 直流稳压电源型号:IT6302 台式多用表型号:UT805A 2.实验&#xff08;箱&#xff09;器材 电路实验箱 元器件&#xff1a;电阻…...

tensorflow2.4--1.框架介绍

前言 虽然1.x版本tensorflow有很多项目都基于此构建&#xff0c;然而随着2.x版本的推出&#xff0c;很多架构已经发生了改变&#xff0c;代码发生了改变&#xff0c;同时很多模组已经废弃不用或者更新,tensorflow1.x已经不能再兼容最新的项目,与时俱进是必要的&#xff0c;因此…...

c++11 关键字 final 使用

写在最前。。。 请支持原创~~ 1. 功能 用以指定一个 virtual function 不能被派生类重写&#xff1b;或者指定一个 class 不能被继承&#xff1b;2. 语法 对于类中成员函数有两种情况&#xff1a; 只声明时&#xff0c;final 紧跟参数的右括号&#xff0c;如果是纯虚函数&a…...

力扣(LeetCode)426. 将二叉搜索树转化为排序的双向链表(2023.02.28)

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表&#xff0c;你可以将左右孩子指针作为双向循环链表的前驱和后继指针&#xff0c;第一个节点的前驱是最后一个节点&#xff0c;最后一个节点的后继是第一个节点。 特别地&#xff0c;我们希望可以…...

华为OD机试真题Python实现【玩牌高手】真题+解题思路+代码(20222023)

玩牌高手 题目 给定一个长度为N的整数数组,表示一个选手在N轮内选择的牌面分数, 选手基于规则选牌,请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分数为其新的总分数选手也可不选择本轮牌面,直接…...

“速通“ 老生常谈的HashMap [实现原理源码解读]

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 HashMap 实现原理&&源码解读 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f…...

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&am…...

mysql数据库limit的四种用法

文章目录前言一、语法二、参数说明三、常用示例-4种用法总结前言 mysql数据库中limit子句可以被用于强制select语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数&#xff0c;第一个参数指定第一个返回记录行的偏移量&#xff0c…...

嵌入式 linux 系统开发网络的设置

目录 一、前言 二、linux网络静态地址设置 前言 为什么要对linux系统下的ubuntu进行网络设置呢&#xff1f; 因为我们在嵌入式开发中&#xff0c;我们要保证windows系统、linux系统、开发板的ip要处于同一个网段&#xff0c;而默认ubuntu下的linux系统的ip是动态分配的&#…...

算法设计与分析——十大经典排序算法一(1--5)

目录 算法设计与分析——十大经典排序算法 第1关&#xff1a;冒泡排序 参考代码 第2关&#xff1a;选择排序 参考代码 第3关&#xff1a;插入排序 参考代码 第4关&#xff1a;希尔排序 参考代码 第5关&#xff1a;归并排序 参考代码 作者有言 一个不知名大学生&#x…...

六.慕课的冲击:知识何以有力量?

6.1知识就是力量?【单选题】关于技术进步,以下说法错误的是&#xff08; &#xff09;。A、技术进步可以不依靠知识积累B、知识的力量推动技术进步C、技术黑箱换句话说即是天上掉馅饼D、专利保护产生的垄断利润,构成创新动力我的答案&#xff1a;A【判断题】罗伯特索洛认为,技…...

SQL基础

sql基础笔记 DATEDIFF() 函数返回两个日期之间的时间。 DATEDIFF&#xff08;parameter1&#xff0c;parameter2&#xff0c;parameter3&#xff09; parameter1&#xff1a;可为 年月日时分秒或周 parameter2&#xff0c;parameter3&#xff1a;合法的日期 如&#xff1a…...

脏牛复现(CVE2016-5195)

nmap扫描全网段&#xff0c;发现存货主机&#xff0c;ip为192.168.85.141nmap 192.168.85.0/24nmap 扫描端口&#xff0c;发现80端口&#xff0c;访问该网站nmap -p1-65535 192.168.85.141扫描该网站目录&#xff0c;什么也没扫出来 &#xff0c;dirb扫描目录的字典在usr/share…...

Redis源码---内存友好的数据结构该如何细化设计

目录 前言 内存友好的数据结构 SDS 的内存友好设计 redisObject 结构体与位域定义方法 嵌入式字符串 压缩列表和整数集合的设计 节省内存的数据访问 前言 Redis 是内存数据库&#xff0c;所以&#xff0c;高效使用内存对 Redis 的实现来说非常重要而实际上&#xff0c;R…...

获取 本周、本月、本年 的开始或结束时间

获取 本周、本月、本年 的开始或结束时间 public class DateTimeUtil{// 获取 本周、本月、本年 的开始或结束时间/// <summary>/// 获取开始时间/// </summary>/// <param name"TimeType">Week、Month、Year</param>/// <param name&quo…...

算法训练营 day58 动态规划 判断子序列 不同的子序列

算法训练营 day58 动态规划 判断子序列 不同的子序列 判断子序列 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而…...

优思学院|DFMEA是全球制造业的必修课!

DFMEA&#xff08;Design Failure Mode and Effects Analysis&#xff09;是一种分析技术&#xff0c;在产品设计的早期阶段识别和解决潜在的失效问题。它通过分析设计的各个方面&#xff0c;识别潜在的失效模式和影响&#xff0c;并提出相应的改进措施&#xff0c;以减少失效的…...

【Day02数据结构 空间复杂度】

最近太忙了都好久没有更新博客了,太难了,抽空水一篇文章,大佬们多多支持. 上篇:时间复杂度分析 目录 前言 一、空间复杂度概念&#xff1f; 二、实例展示 三、.有复杂度要求的算法题练习 1.题目链接&#xff1a;力扣--消失的数字 2.题目链接&#xff1a;力扣--旋转数组 总结: 1…...

多数据库管理工具哪家强?ChatGPT点评,第一位并不是Navicat

SQL逐渐成为职场必备的编程语言&#xff0c;相信大家都不陌生。SQL是一种结构化查询语言&#xff0c;是用于数据库之间通信的编程语言。每个数据库都有着自己独特的访问规则&#xff0c;但大体上是遵循SQL标准。 因此&#xff0c;辗转于不同的数据库之间&#xff0c;开发者或D…...

UnityShader常用函数(UnityShader内置函数、CG和GLSL内置函数等)

空间变换函数函数名描述float4 UnityWorldToClipPos(float3 pos )把世界坐标空间中某一点pos变换到齐次裁剪空间float4 UnityViewToClipPos(float3 pos )把观察坐标空间中某一点pos变换到齐次裁剪空间float3 UnityObjectToViewPos(float3 pos或float4 pos)模型局部空间坐标系中…...

Springboot自定义注解-1

注解用于修饰其他的注解(纪委&#xff1a;管干部的干部) ① Retention&#xff1a;定义注解的保留策略 Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中&#xff0c;在class字节码文件中不包含 Retention(RetentionPolicy.CLASS) …...

经纬度标定及大地坐标系相关概念(一)

经纬度标定及大地坐标系相关概念&#xff08;一&#xff09;一、背景二、经纬度的概念三、大地坐标系四、大地坐标系的分类五、各类坐标系介绍5.1 我国地理坐标系5.1.1 北京54坐标系5.1.2 1980西安坐标系5.1.3 2000国家大地坐标系5.2 世界大地坐标系5.1.1 WGS84坐标系5.3 加密坐…...

synchronized关键字原理

synchronized原理 1、基本特点 基于锁策略&#xff0c;可以知道synchronized具有以下特性&#xff1a; 1.开始时候是乐观锁&#xff0c;如果锁冲突频繁就转换为悲观锁 2.开始是轻量级锁&#xff0c;如果锁持有的时间较长&#xff0c;就转换成重量级锁 3.实现轻量级锁的时候…...

面试被问死怎么办?学会这四招,通过的机率提升30%

软件工程师面试很难&#xff0c;难到什么程度呢&#xff1f;有一句话可以来形容&#xff1a; 面试造飞机&#xff0c;上班拧螺丝 没错&#xff0c;面试的时候各种问你原理、机制&#xff0c;而这些在实际工作中却很难用到。于是乎&#xff0c;很多工程师面试的时候就非常害怕…...

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件&#xff0c;在leanback的依赖库中&#xff0c;这里介绍一些常用的组件&#xff0c;使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…...

Xshell 下载及安装

文章目录下载安装连接服务器Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界…...

【LeetCode】剑指 Offer(12)

目录 题目&#xff1a;剑指 Offer 30. 包含min函数的栈 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 30. 包含m…...

vue在history模式下打包部署问题解决

引言 项目使用的模板是element-template&#xff0c;由于业务需要&#xff0c;我将路由的hash模式更改为了history模式&#xff0c;然后在打包部署项目时就出现了问题 个人发现是资源的访问路径有问题&#xff0c;在部署之后发现每次访问的js资源路径前都会自动携带上我路由的…...

Java中常见性能优化策略的总结

文章目录1. 代码优化2. 数据库层面优化SQL调优架构层面的调优连接池调优3. 网络优化4. 缓存缓存分类使用场景选型考虑什么时候更新缓存&#xff1f;如何保障更新的可靠性和实时性&#xff1f;缓存是否会满&#xff0c;缓存满了怎么办&#xff1f;缓存是否允许丢失&#xff1f;丢…...

c++日志库log4cplus使用

项目中需要打印log&#xff0c;方便程序调试和问题定位分析。C实现的log4cplus日志库是一种易于使用的C 日志记录API&#xff0c;可提供线程安全&#xff0c;灵活且任意粒度的日志管理和配置控制。 下面介绍一下在linux中安装log4cplus库过程 下载地址&#xff1a;https://gi…...

什么是接口测试,我们如何实现接口测试?

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…...

随机森林在sklearn中的实现

目录 一.集成算法 二.sklearn中的集成算法模块ensemble 三.RandomForestClassifier(随机森林分类器) 四.重要参数 1.基评估器参数 2.随机森林参数 五.重要属性和接口 六.Bagging的另一个必要条件 七.RandomForestRegressor(随机森林回归器) 八.机器学习中调参的基本思…...

[论文总结] 深度学习在农业领域应用论文笔记11

深度学习在农业上的应用笔记11 最近发表的相关论文数量不多&#xff0c;质量普遍也不尽如人意&#xff0c;尤其是《Computers and Electronics in Agriculture》这个期刊。这些论文的方法都很简单&#xff0c;只是强行将深度学习应用于某个问题上&#xff0c;而没有考虑到农业…...

Android 9.0 SystemUI 状态栏屏蔽弹出的悬浮式通知

1.概述 在9.0的系统ROM产品定制化开发中,在systemui的状态栏中,会在有闹钟 wifi连接等特殊弹窗通知的时候,会在接收到系统通知时,弹窗悬浮式弹窗通知,然后过几秒中, 就消失了,所以像这样的悬浮式通知,在有些产品中是不需要的,要求屏蔽掉,这就需要按照悬浮式流程来分析…...

商简智能计划与排程SPS在纺织行业中的应用

企业背景 某织造、染色及后整理一体化工艺的纺织面料企业&#xff0c;主要从事户外功能运动服装、内衣、泳衣、汽车内饰等面料的研发和销售&#xff0c;年产值在20亿左右&#xff0c;是迪卡侬运动面料最优质供应商之一。 纺织行业特点 印染具有典型的流程行业特性&#xff0c…...

549、RocketMQ详细入门教程系列 -【消息队列之 RocketMQ(三)】 2023.02.28

目录一、Spring 整合 RocketMQ1.1 消息生产者1.2 消息消费者1.3 Spring 配置文件1.4 运行实例程序二、参考链接一、Spring 整合 RocketMQ 不同于 RabbitMQ、ActiveMQ、Kafka 等消息中间件&#xff0c;Spring 社区已经通过多种方式提供了对这些中间件产品集成&#xff0c;例如通…...

如何使用SpringBoot ⽇志?

Spring Boot自定义日志的打印:在一个类中先获取到打印日志对象&#xff08;日志框架提供的日志对象&#xff0c;而日志框架默认已经集成到Spring Boot里了&#xff0c;springboot默认使用 slf4jlogback);注意&#xff1a;得到日志对象Logger ->来自于slf4j2、使用目志对象提…...

山东大学数字图像处理实验:MATLAB的图像显示方法

文章目录MATLAB 学习实验目的实验原理及方法实验内容MATLAB的图像显示方法实验目的实验内容MATLAB 学习 实验目的 了解 MATLAB 的基本功能及操作方法。掌握典型离散信号的 Matlab 产生和显示。 实验原理及方法 在 MATLAB 中, 序列是用矩阵向量表示, 但它没有包含采样信息, …...

Java缓存面试题——Redis解决方案

文章目录1、什么是缓存击穿&#xff1f;该如何解决2、什么是缓存穿透&#xff1f;该如何解决3、什么是缓存雪崩&#xff1f;该如何解决4、什么是BigKey&#xff1f;该如何解决bigkey的危害发现bigkey解决bigkey5、redis过期策略都有哪些&#xff1f;6、讲一讲Redis缓存的数据一…...

Flink:The generic type parameters of ‘Collector‘ are missing 类型擦除

类型擦除问题处理报错日志描述问题描述报错解决其他方法方法一&#xff1a;TypeInformation方法二&#xff1a;TypeHint报错日志描述 报错日志&#xff1a; The generic type parameters of Collector are missing. In many cases lambda methods dont provide enough informa…...

MySQL查询操作

系列文章目录前言一、简单查询SELECT子句SELECT后面之间跟列名DISTINCT,ALL列表达式列更名WHERE子句WHERE子句中可以使用的查询条件比较运算BETWEEN...AND...集合查询&#xff1a;IN模糊查询LIKE空值比较&#xff1a;IS NULL多重条件查询SELECT 的基本结构ORDER BY子句排序聚集…...

Redis-day01-note

Redis-day01-note 文章目录**Redis-day01-note****安装****配置文件详解****数据类型****字符串类型(string)**列表数据类型&#xff08;List&#xff09;****与python交互**Redis介绍特点及优点 1、开源的&#xff0c;使用C编写&#xff0c;基于内存且支持持久化 2、高性能的…...

嵌入式C基础知识(19)

时序在前面我们说到当处理器要向外设芯片写数据时&#xff0c;需要先将所需访问的外设的地址放在地址总线上&#xff0c;然后&#xff0c;由译码器将地址总线上的数据转换成片选信号&#xff0c;片选信号则使能目标外设芯片&#xff0c;接下来处理器写数据到数据总线上&#xf…...

java 2(程序流程控制)【含例题详解】

java ——程序流程控制 ✍作者&#xff1a;电子科大不知名程序员 &#x1f332;专栏&#xff1a;java学习指导 各位读者如果觉得博主写的不错&#xff0c;请诸位多多支持&#xff1b;如果有错误的地方&#xff0c;欢迎在评论区指出 目录java ——程序流程控制分支结构if-elsesw…...

基于Conda完成创建多版本python环境

文章目录基于Conda完成创建多版本python环境基于Conda完成创建多版本python环境 通过cmd打开conda环境 d:\ProgramData\Anaconda3\Scripts\activate创建python3.7的环境 conda create -n py3.7 python3.7产生错误 Collecting package metadata (repodata.json): failed Unav…...

35岁的测试被裁,公司地位还不如00后...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…...