【Linux】进程信号及信号产生

2023-11-02


在这里插入图片描述

一. 生活层面的信号

在学习进程信号前,我们不妨认识一下现实中有哪些信号。
日常生活中,眼神,语气,手势,等等,都可以是一个信号,都可以传递一定信息。而我们常见的红绿灯,红灯代表禁止通行,绿色代表允许通行,黄灯代表转换过渡。这些并不是我们一开始就知道,是因为大众的共识性。而各种手势,也是在幼儿园老师有所教导,我们才得以认知。
所以信号的创建是需要被人们所认知的。

我们可以通过生活中的一些事情引出信号的预备知识
进程信号的预备知识

网购是当今热门的购物选择,当我们网购的东西送到时,我们就会收到,“快递到了”这一信号,
首先,这一信号是大众的共识性认知,我们可以“识别信号
其次,在收到这一信号时,我们可能立刻就去取快递了,但是也有可能我们正在做着一些不方便离开的事情,所以我们不会立刻去取快递。这就说明,信号的处理和信号的接收并不一定衔接。我们可以在“合适的时候处理信号
并且,如果我们不立刻去取快递,我们还需要记录“快递到了”这一信号,因为我们需要之后处理。我们需要“记住有一个信号要处理
最后,对于快递的处理,1. 默认动作(打开快递);2. 自定义动作(如果是卖给女朋友的礼物,就送给女朋友);3. 忽略
PS:快递的到来是不定时的,接收快递和我们已经在做的事是异步的

总结一下:

  1. 信号创建首先是需要能被人们识别
  2. 接收信号后可以不立刻处理信号,等到合适的时候再处理
  3. 因为可以不立刻处理信号,那么就需要存在记录信号的能力
  4. 信号的产生对于进程来说是异步

二. 进程信号

我们可以通过kill -l命令查看所有的进程信号
在这里插入图片描述
其中,1到31是非实时信号34到64是实时信号
本篇博客仅学习部分非实时信号。
实时信号,只需要保存有无产生,不需要立刻处理,具体处理可以之后进行。
操作系统可被分为实时系统非实时系统Linux和Windows都是非实时系统,而实时系统是高响应的,需要对任何命名立刻响应。比如车载系统中的刹车

而非实时信号刚好有32个,操作系统使用位图来存储非实时信号。存储在进程的pcb结构体中,所以发送信号其实是将信号写入进程pcb的位图,修改位图的比特位,将0->1
比特位的位置:信号的编号
比特位的内容:是否收到该信号

在Linux中,当我们不小心写了一个死循环的程序,我们可以通过ctrl+c终止这个程序
在这里插入图片描述
ctrl+c其实就是通过键盘输入给OS,OS捕捉,然后发送一个信号给当前进程,然后终止这个程序。
另外还有一点需要注意,ctrl+c只能终止前台进程,如果我们将程序变为后台运行,则无法通过ctrl+c终止,不过可以使用kill+信号终止进程
在这里插入图片描述

其实ctrl+c本质是让OS给指定进程发送2号信号SIGINT

接下来我们通过singal()函数验证一下
在这里插入图片描述

signal函数可以接收信号,并由我们指定接收该信号后,执行的动作。
比如ctrl+c是发送了2号信号,执行动作是终止程序
int signum:接收的信号
sighandler_t handler:sighandler是一个函数指针,函数的返回值是void,参数是int。

接下来,我们用一个程序证明ctrl+c本质是发送了2号信号
在这里插入图片描述

可以看到,这次我们使用ctrl+c没能终止程序,而且打印出了"get signal:2",并且当我们发送2号信号,也是执行handler方法
首先,我们使用signal函数对2号信号进行捕捉,并且让handler作为2号信号的处理动作
并且OS会将接收的信号传参给handler。所以我们使用ctrl+c没能终止程序,而是打印出了handler的内存
我们上面也讲了,对信号的处理分三种:默认动作,自定义动作,忽略
终止程序就是2号信号的默认动作,而我们编写的handler就是自定义动作


我们可以通过man 7 signal查看信号的默认动作
在这里插入图片描述
Term就代表终止进程
PS:ctrl+\是发送3号信号SIGQUIT,但是9号信号SIGKILL是管理员信号,即使使用signal捕捉执行自定义动作,kill -9还是执行默认动作即终止进程。

三. 硬件中断

我们按下crtl+c,那计算机是怎么知道我们输入了什么数据呢?
键盘其实是通过硬件中断的方式,通知操作系统,我们按下了按键
注意:硬件中断只是让操作系统知道我们按下了按键,但是具体按了什么,操作系统此时还不知道

那么,什么是硬件中断呢?
在这里插入图片描述

内核中有中断控制器这样一个硬件,我们拿8259举例,当我们按下键盘,其实是发送了电脉冲,然后通过中断控制器发送给特定的CPU特定的针脚。当针脚处于高电频时,就相当于写入数据,CPU中的寄存器会写入高电频针脚的编号。这就是发送中断的过程
中断向量表类似于函数指针数组,CPU获得中断后,就会找中断向量表中对应的函数指针调用对应的方式
比如9号针脚高电频,那么寄存器中就会写入9,然后找中断向量表中9号函数指针,调用“从键盘获取对应数据”的方法。这就是硬件中断。

注意:键盘被按下,键盘哪些被按下是两个不同的步骤。

键盘被按下,对应的是硬件中断
键盘哪些被按下,对应的是中断向量表中的方法获取键盘输入的数据。

所以ctrl+c发生信号的本质是:

先按下按键,CPU获得硬件中断,然后调用方法,OS去读取键盘输入的ctrl+c数据,OS再将其解释为信号,并发送给前台进程,写入其pcb结构体的信号的位图

四. 信号产生

信号的第一种产生方式是通过键盘ctrl+cctrl+/
第二种产生方式是kill指令

第三种产生方式是通过系统调用

第一个系统调用函数是kill()
在这里插入图片描述

int pid:指定给某个进程发送信号
int sig:发送几号信号

接下来,我们可以模拟实现kill命令

mykill.cc
模拟实现 kill 命令

#include<iostream>
#include<cstdlib>
#include<cerrno>
#include<cstring>
#include<unistd.h>
#include<signal.h>
#include<string>
#include<sys/types.h>


using namespace std;

//传参不正确,展示使用手册
void Usage(string proc)
{
    cout<<"Usage:"<<endl;
    cout<<"\t"<<proc<<" 信号编号 目标进程"<<endl;
}

//   ./mykill 9 1234
int main(int argc,char*argv[])
{
    //argc:命令行参数个数
    if(argc!=3)
    {
        //第一个参数是 比如: ./进程名
        Usage(argv[0]);
        exit(1);  
    }
    
    //信号
    int signo=atoi(argv[1]);
    //目标进程的pid
    int target_id=atoi(argv[2]);

    //发送信号
    int n=kill(target_id,signo);
    if(n!=0)
    {
        cerr<<errno<<" : "<<strerror(errno)<<endl;
        exit(2);
    }

    return 0;
}

myproc.cc
死循环程序,需要被杀死的程序

#include<iostream>
#include<unistd.h>

using namespace std;

int main()
{
    while(1)
    {
        cout<<"我是一个进程,我正在执行...,我的pid:"<<getpid()<<endl;
        sleep(1);
    }


    return 0;
}

运行结果如下:
在这里插入图片描述


第二个系统调用函数是raise()
在这里插入图片描述

int sig:几号信号

在这里插入图片描述
可以看到,调用完raise(2)后,程序就结束了,并没有输出后续内容。


第三个系统调用函数是abort()
在这里插入图片描述
调用abort()函数,会给当前进程发送6号信号SIGABRT
但是abort()是C语言的接口,其函数内部还有类似exit的操作,所以即使使用signal函数捕捉6号信号,进行自定义动作,abort函数还是会使进程终止


第四种信号产生的方式是由软件条件产生信号
在这里插入图片描述

unsigned int seconds:seconds秒之后给该进程发送14号信号SIGALRM
但是我们可以通过发送14号信号,提前触发alarm。而当我们再调用alarm(),其返回值就是上一次alarm还剩余的时间
但如果我们提前触发alarm,但是没有重新设置,则之后还会再收到一次alarm。alarm(0)代表取消闹钟
比如我们设置一个alarm(30),但如果我在20秒时,给该进程发送14号信号,然后我再调用alarm(15),那么就会再设置一个15秒的闹钟,但是这个闹钟的返回值是上一次闹钟剩余时间,也就是10秒。
PS:alarm是系统接口,OS中有维护alarm的结构体,会定期查看是否有闹钟超时


第五种信号产生的方式是硬件异常

我们在编写C/C++代码时,有时候可能会出现除0野指针的情况
他们的报错分别是这样的
在这里插入图片描述
我们以前在语言层面的理解,就是程序崩溃了。
但是在操作系统层面,其实是OS给进程发送信号,终止进程。


除0引发的硬件异常
在这里插入图片描述

CPU中其实有很多寄存器,计算就发生在寄存器中。而有一个寄存器叫作状态寄存器,当本次计算溢出时,状态寄存器就会被置为1反之为0
而一旦状态寄存器为1,就会发生硬件异常,操作系统会得知这个异常。CPU还会存储当前调度的进程的pcb结构体的地址,操作系统在得知异常后,根据CPU记录的pcb地址,给该进程发送信号

除0本质是触发了硬件异常,操作系统给该进程发送了8号信号
在这里插入图片描述


野指针引发的硬件异常

在这里插入图片描述

如果我们对空指针解引用,修改其内部的值。
空指针默认是虚拟地址的0地址,而通过页表映射到物理地址
修改指针内部的值,第一步是先进行虚拟地址到物理地址的转换
而页表其实是有MMU硬件——内存管理单元进行管理的
PS:MMU硬件是CPU的其中一个硬件
当出现以下情况之一,MMU就会报错,触发硬件异常

  1. 虚拟地址没有映射,MMU硬件报错
  2. 有映射,但是没有修改的权限,MMU硬件报错

而MMU硬件报错,触发硬件异常,OS根据CPU中记录的当前进程的pcb地址,并发送信号,终止该进程。

野指针本质也是触发了硬件异常,操作系统给该进程发送了11号信号
在这里插入图片描述


五. Term&Core

在这里插入图片描述
我们之前讲了,Term是终止进程的意思,但是刚刚的除0,野指针的8号,13号信号时Core,但好像也是直接终止进程,那么这两个有什么差别吗?


首先,OS可以将一个进程在异常的时候,可以将核心代码部分进行核心转储,将内存中进程的相关数据,全部转储到磁盘中。并在可执行程序的目录下,形成core.pid的核心转储文件。

我们可以通过ulimit -a指令查看当前进程的限制
在这里插入图片描述
而为什么我们之前没有看到核心转储文件呢,因为云服务器默认是关闭形成核心转储文件这一功能的,将可形成的核心转储文件大小设为0。

我们可以使用ulimit -c 大小 设置可形成的核心转储文件大小
在这里插入图片描述
而这时,我们就可以发现Term和Core二者的差别了。

在这里插入图片描述
在这里插入图片描述

我们发现,Action显示是Core的信号,在终止进程后,会显示出(core dumped),并在当前目录下形成了core文件

所以,Term的终止就是终止,没有多余动作
Core则是在终止时,会先进行核心转储,再终止进程


1. 核心转储的意义

在这里插入图片描述
我们打开core文件,发现其实一个二进制文件。不是给我们看的
那核心转储的意义是什么呢?

其实,信号和退出码的作用是一样的,都是在进程结束后,反馈给程序员的信息,当程序异常结束时,我们可以知道是正常结束,还是异常终止;异常终止又是因为什么?
而core文件其实就是给程序员后期调试用的文件。
我们需要使用Debug方式形成可执行程序,并且使用gdb调试,才可以体会core文件的意义。(gcc / g++默认是形成release版本,最后加-g选项形成Debug版本)

在这里插入图片描述
通过core文件,我们在gdb的调试中,可以直接定位到产生异常的位置。
这种调试称为事后调试

2. 云服务器为什么关闭核心转储

一个大的程序,出现问题时,都无法立刻解决,程序可能会崩溃,但可能会有检测程序对其重启,而如果核心转储处于打开状态,一次崩溃就会形成一个core文件;如果这个程序在半夜崩溃,就会一直重启,崩溃,反复进行,每一次重启的进程又不同,正如上述,同一个程序,只是变成进程后的pid不同,Core终止就会重新形成一个core文件
这样就会造成很多浪费,所以云服务器一般关闭核心转储功能。
ulimit -c 0就是关闭核心转储

3. core dump标志

在进程等待时,父进程获取子进程的退出信息使用的status位图结构
在这里插入图片描述
在正常终止时,位图的8~15位是退出码
被信号所杀时,0~6是终止信号,而第8位是core dump标志。
如果该进程核心转储功能是打开的,那么该进程的core dump为1,反之为0。

六. 总结

  1. 所有的信号产生,最终都要OS来执行,因为OS是软硬件的管理者,也是进程的管理者
  2. 信号的处理可以不立刻处理,进程可以在合适的时候再对信号进行处理
  3. 如果不立即处理,那么信号需要被记录到pcb结构体
  4. 一个进程在没有收到信号的时候,是知道如何处理某个信号的,因为在编码时已经提供给每个进程了
  5. 任何一种信号产生,不管是通过键盘,还是指令,系统调用…本质都是操作系统往进程的pcb结构体中写入信号

结束语

本篇内容到此就结束了,感谢你的阅读!

如果有补充或者纠正的地方,欢迎评论区补充,纠错。如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程信号及信号产生 的相关文章

  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • Linux >2.6.33:可以使用 sendfile() 来实现更快的“猫”吗?

    必须将大量大文件连接成一个更大的单个文件 我们目前使用 cat file1 file2 output file but are wondering whether it could be done faster than with that
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so

随机推荐

  • 关于this.$refs是undefined

    问题 最近在做开发的时候 遇到这样一个问题 从后端请求到一个图片列表 需要根据返回图片的情况设置元素的宽度 这就需要这样计算list的宽度imgList length imgElement clientWidth 为了在各种移动端自适应 不
  • opencv 解决ippicv下载问题,离线:ippicv_2019_lnx_intel64_general_20180723.tgz

    ippicv 2019 lnx intel64 general 20180723 tgz 这个下载超级慢 有设么用呢 硬件加速 人脸识别 说法不统一啊 以后再完善 下载超时怎么办呢 那我们就采取手动下载的模式然后离线安装 1 下载 ippi
  • UE4像素流

    UE4像素流 局域网 公网 文章目录 UE4像素流 局域网 公网 TOC 文章目录 前言 一 启用像素流 二 项目设置配置像素流参数以及打包 1 配置 打包 配置启动参数 启动像素流服务 信令服务器 http服务 80端口 8888端口 端
  • DDD的分层架构

    DDD作为一种指导思想 还是有一些相对来说可以落地的东西 比如说他这个分层架构 整体分为以下四层 实际上基于上图 我们可以把我们项目工程文件再具体一点 填写到上面的图片上 用户接口层 user interface 用户接口层负责向用户显示信
  • poi生成word文档,包含插入表格

    package com controller import java io FileInputStream import java io FileOutputStream import java io IOException import
  • 「京谈客服系统」出击:京东再起TO B战事

    对于企业而言 基于京谈的技术支持 企业能够获得的不仅仅是客服系统的优化重塑 更多的是把业务直接建立在京东对于客服系统的理解之上 从产业的视角重新定义自身客服体系 作者 皮爷 出品 产业家 数字化浪潮正滚滚而来 8月2日 财富 杂志发布了最新
  • PostgreSQL:“more than one owned sequence found“异常问题解决

    问题 本地数据库正常 但还原部署到服务器数据库后 添加表记录时提示 more than one owned sequence found 的异常报错 解决方案 这个问题是自增列引起的 可能迁移或还原数据表结构时出现异常 解决的办法是重置标识
  • 算法-分治算法

    文章目录 分治算法 什么是分治算法 分治算法的优点 分治算法的核心思想 分治算法的技巧 分治算法的边界 分治算法的常见题型及讲解 归并排序及逆序对问题 归并排序 逆序对问题 快速排序和第k小数 快速排序 第k小数 树的遍历 树的先序遍历 树
  • 高手需要具备的思维模型

    01 思维模型 决定了你的人生状态 电影 教父 中 有一句经典台词 花半秒钟看透本质的人 和花一辈子都看不清的人 注定拥有截然不同的命运 思维模型 决定了你的人生状态 2014年 张一鸣观察到移动互联网时代面临的问题 信息爆炸式增长的同时
  • MATLAB零基础入门(一)

    大家好 我是Henry 上一期的Python爬虫实践中 Henry导入了Matplotlib库进行了新冠疫情的每日新增的绘图 其实Matplotlib的原型是另一门应用非常广泛的语言 Matlab 最近Henry也学习了一些Matlab的绘
  • 【C/C++时间系列】通过gmtime()函数将时间戳转换成GMT时间

    GMT Greenwich Mean Time 格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时 也就是在格林尼治时 的时间 地球每天的自转是有些不规则的 而且正在缓慢减速 所以 格林尼治时间已经不再被作为标准时间使用 现在的标准时间
  • 记一次成功把Vue2后台项目改造成Vite2的踩坑经历

    文章目录 前言 一 项目背景 1 1 为什么要选择Vite 二 迁移前的准备 2 1 补全 vue后缀 2 2 移动public index html的位置 2 2 1 通过vite plugin html插件来修改页面标题 2 3 新建v
  • CCF计算机软件能力认证 C++ 权限查询

    问题描述 授权 authorization 是各类业务系统不可缺少的组成部分 系统用户通过授权机制获得系统中各个模块的操作权限 本题中的授权机制是这样设计的 每位用户具有若干角色 每种角色具有若干权限 例如 用户 david 具有 mana
  • Python Flask简介及安装

    Python Flask简介及安装 Flask 是一个 Python 实现的 Web 开发微框架 一 Flask 简介 Flask 诞生于2010年 是 Armin ronacher 人名 用 Python 语言基于 Werkzeug 工具
  • 嵌入式复习题(五)程序分析题

    1 定时器 假设定时器内部时钟为16MHz 1 完成下面的注释 2 可以定时的时间为 5 ms htim3 Instance TIM3 htim3 Init Prescaler 799 预分频系数为799 htim3 Init Counte
  • 【Network】计算机网络基础知识总结

    阅读目录 网络层次划分 OSI七层网络模型 IP地址 子网掩码及网络划分 ARP RARP协议 路由选择协议 TCP IP协议 UDP协议 DNS协议 NAT协议 DHCP协议 HTTP协议 一个举例 网络层次划分 为了使不同计算机厂家生产
  • 神经网络学说的主要观点,对神经网络的简单理解

    心理学中定位说和模块说的区别是 整体说和神经网络学说的区别是 模块说和神经网络学说的区别是 简单说下 希望对你有帮助 定位说认为 大脑的具体功能是对应具体的部位 模块说认为 大脑的具体功能是由多个部位形成的模块共同实现的 而不是具体到位置
  • 论文理解:Generating Diverse High-Fidelity Images with VQ-VAE-2

    深度生成模型都有什么问题 研究者将常见的生成模型分为两种 一种是基于似然的模型 包括 VAE 及其变体 基于流的模型 以及自回归 autoregressive 模型 另一种是隐式生成模型 如生成对抗网络 GAN 这些模型都会存在某些方面的缺
  • 例说数据结构&STL(九)——map

    1 白话map map是STL的一个关联容器 它提供一对一 其中第一个可以称为关键字 每个关键字只能在map中出现一次 第二个可能称为该关键字的值 的数据处理能力 由于这个特性 它完成有可能在我们处理一对一数据的时候 在编程上提供快速通道
  • 【Linux】进程信号及信号产生

    文章目录 一 生活层面的信号 二 进程信号 三 硬件中断 四 信号产生 五 Term Core 1 核心转储的意义 2 云服务器为什么关闭核心转储 3 core dump标志 六 总结 结束语 一 生活层面的信号 在学习进程信号前 我们不妨