首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux信号】一:信号概念、信号产生

这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送信号是信息载体,是Linux/UNIX 环境下,古老而经典通信方式, 现在依然是主要通信手段。...每个进程收到所有信号,本质上都是由内核负责发送,由内核去处理,我们名义上说是进程A发送信号给进程B,实质上信号是由内核产生,由内核发送,并由内核处理。...3.4 PCB中信号相关信息 Linux内核进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关信息,主要指阻塞信号集和未决信号集...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中信号。...返回上次定时器剩余秒数。我们实现约定好多少秒时候发送一个信号,alarm()函数返回距离发送信号还剩余秒数,如果没有剩余时间或没有约定发送信号返回0。

8710

Linux信号】三:信号捕捉

signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本Unix和不同版本Linux中可能有不同行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...注册捕捉函数,所谓捕捉信号就是指,信号发生时执行什么动作。 函数参数 signum:要捕捉信号编号。 act:传入参数(const修饰,不可修改),新处理方式。...实际上是这样,未决信号集中使用某一位0和1来记录信号是否被处理,所以不管这个信号发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...printf("pid: %d\n", getpid()); sleep(1); } return 0; } 编译运行可以看到,虽然按了多次ctrl+c,发送了多个信号

13510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux系统编程之信号(二):一些信号发送函数和不同精度睡眠

    kill函数可以给一个指定进程或进程组发送指定信号,其中kill 函数pid 参数取值不同表示不同含义,具体可man 一下。...raise函数可以给当前进程发送指定信号(自己给自己发信号)。killpg 函数可以给进程组发生信号。这三个函数都是成功返回0,错误返回-1。... */ 程序中注册信号在fork之前,故子进程也会继承,在子进程中对进程组发送信号,故信号处理函数会被调用两次: simba@ubuntu:~/Documents/code/linux_programming...即每隔1s就会发送一个SIGALRM信号,其实alarm函数时间到时只发送一次信号,我们在信号处理函数中再次调用alarm函数,造成不断信号发送。...参数 which取值: ITIMER_REAL:经过指定时间后,内核将发送SIGALRM信号给本进程  ITIMER_VIRTUAL :程序在用户空间执行指定时间后,内核将发送SIGVTALRM

    1.2K00

    初谈Linux信号-=-信号产生

    也就是你“识别快递” 当快递员到了你楼下,你也收到快递到来通知,但是你正在打游戏,需5min之后才能去取快递。那 么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。...忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来整个过程,对你来讲是异步,你不能准确断定快递员什么时候给你打电话 Linux信号Linux操作系统中通过kill -l命令可查看所有的信号...信号Linux系统提供一种向指定进程发送特定事件一种方式,系统在收到信号时会做识别和处理。...信号产生 通过kill命令,向指定进程发送指定信号 键盘可以产生信号:ctrl+c、ctrl+\ 系统调用方式 #include #include #include...程序非法访问导致操作系统给进行发送信号,由于收到信号,程序会退出。野指针对应发送信号时SIGSEGV,除0对应信号为SIGFPE。

    7610

    Linux信号处理

    信号处理 1 信号处理 2 内核态 VS 用户态 3 键盘输入数据过程 4 如何理解OS如何正常运行 5 如何进行信号捕捉 信号处理总结 6 可重入函数 volatile关键字 Thanks♪...在CPU中,键盘按下时会向cpu发送硬件中断,CPU就会读取中断号读到寄存器中,CPU会告诉OS,后续通过软件来读取寄存器。...每个硬件都有自己中断号,键盘也是。按下键盘时,向CPU发送中断信号,然后调用键盘读取方法,将键盘数据读取到内存中!这样就不需要轮询检查键盘是否输入了!...来看Linux内核: 在操作系统主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...信号处理总结 对于信号我们学习了三个阶段: 信号产生与发送:中断,异常,系统调用。 信号保存:三张表:阻塞,未决和递达 信号处理 6 可重入函数 介绍一个新概念:可重入函数。

    8910

    Linux笔记(15)| Linux信号

    今天要分享Linux信号机制,信号是一种软件中断,是一种处理异步事件方法,可以很好地在多个进程之间进行同步和简单数据交换。...一、发送信号 发送信号通常有三种方式,分别是使用kill、raise、sigqueue函数 1、kill函数 int kill(pid_t pid,int sig); 第一个参数代表向谁发送,第二个参数代表发送什么信号...; void *sival_ptr; }sigval_t; 这个函数除了发送信号之外,还能携带一些参数,这些参数就保存在共用体里面。...二、信号注册和响应 前面讲了三种发送信号方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。...接下来写一个简单代码,来应用一下上面的几个函数。实现需求就是创建一个子进程,父进程每隔一秒钟向子进程发送一个信号,子进程收到信号之后往一个txt文档中写入一句话。

    2.6K10

    Linux驱动实践:驱动程序如何发送信号】给应用程序?

    kill 命令和信号 使用 kill 命令发送信号 关于 Linux 操作系统信号,每位程序员都知道这个指令:使用 kill 工具来“杀死”一个进程: $ kill -9 这个指令功能是...:向指定某个进程发送一个信号 9,这个信号默认功能是:是停止进程。...虽然在应用程序中没有主动处理这个信号,但是操作系统默认处理动作是终止应用程序执行。 除了发送信号 9,kill 命令还可以发送其他任意信号。...在 Linux 系统中,所有的信号都使用一个整型数值来表示,可以打开文件 /usr/include/x86_64-linux-gnu/bits/signum.h(你系统中可能位于其它目录) 查看一下...驱动程序代码示例:发送信号 功能需求 在刚才简单示例中,可以得出下面这些信息: 信号发送方:必须知道向谁[PID]发送信号发送哪个信号; 信号接收方:必须定义信号处理函数,并且向操作系统注册:接收哪些信号

    2.8K30

    ReactiveCocoa 中 RACSignal 是如何发送信号

    用户交互事件绑定 RAC为可交互UI控件提供了一系列发送Signal信号方法。这些数据流会在用户交互中相互传递。...看上图描述,新信号发送长度等于前面两个信号长度之和,concat之后信号结束信号也就是第二个信号结束信号。...有值以后就打包成元组RACTuple发送出去。并清空两个数组0号位置存储值。 以后两个信号每次发送一个,就先存储在数组中,只要有“配对”另一个信号,就一起打包成元组RACTuple发送出去。...从图中也可以看出,zipWith之后信号,每个信号发送时刻是等于两个信号最晚发出信号时刻。 新信号完成时间,是当两者任意一个信号完成并且数组里面为空,就算完成了。...所以最后第一个信号发送5那个值就被丢弃了。 第一个信号依次发送1,2,3,4值和第二个信号依次发送A,B,C,D值,一一合在了一起,就像拉链把他们拉在一起。

    1.7K30

    Linux】 进程信号发生

    我们可以看看在Linux系统下信号信号时从 1 - 64 数字对应信号(32 - 64 是实时信号,暂不考虑) 信号生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念基础储备 信号Linux系统通过一种向目标进程发送指定事件方式。要做识别和处理。...那么发送信号:就是修改指定进程pcb信号指定位图 0 -> 1。也就是“写信号” 通过上面的分析,发送信号改变了内核数据结构,而这个工作只能是OS来进行,所以只有OS可以发送信号。...那么kill信号向进程发送信号!还有其他可以发送信号方式吗?...我们来看: 3 信号产生 信号产生方式有以下几种: 通过kill命令:向指定进程发送指定信号 键盘可以产生信号:我们常用ctrl + c (2号信号)和 ctrl + \(3号信号)都可以向进程发送信号

    9710

    Linux】详解信号保存&&信号屏蔽字设置

    一、信号处理一些常见概念 实际执行信号处理动作称为信号递达(Delivery)。 信号从产生到递达之间状态,称为信号未决(Pending)。 进程可以选择阻塞 (block )某个信号。...被阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作。 注意:阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选一种处理动作。...在程序运行起来到程序运行到20秒期间,我给程序发送2号信号,应该看到pending位图中2号信号位置为1但程序不退出,到了20秒时程序退出。...<< std::endl; return 1; } 查看pending表,观察退出状态: int cnt = 0; //查看pending位图,给进程发送2号信号...sigemptyset(&pending); int m = sigpending(&pending); print(pending); sleep(1); } 发送

    10410

    Linux驱动实践:中断处理函数如何【发送信号】给应用层?

    大家好,我是道哥,今天我为大伙儿解说技术知识点是:【中断程序如何发送信号给应用层】。 最近分享几篇文章都比较基础,关于字符类设备驱动程序,以及中断处理程序。...根据之前文章Linux驱动实践:驱动程序如何发送信号】给应用程序?,应用程序必须主动把自己 PID 告诉驱动模块才可以。...copy_from_user(&g_pid, pArg, sizeof(int)); } } 知道了应用程序 PID,驱动程序就可以在中断发生时候(按下键盘ESC键),发送信号出去了: static...因为只有在按下键盘ESC按键时,驱动程序才会发送信号上来,因此应用程序需要一直存活着。...这可以通过 dmesg 命令输出信息看出来: 这个时候,按下键盘 ESC 键,此时驱动程序中打印如下信息: 说明:驱动程序捕获到了键盘 ESC 键,并且发送信号给应用程序了。

    3.5K51

    Linux】进程信号 --- 信号产生 保存 捕捉递达

    二、信号发送(修改PCB信号位图) 1.通过键盘发送信号(kill指令 和 热键) 1....平常在我们终止前台进程时候,大家第一感受就是只要我们按下组合键ctrl+c,进程就会被立马终止,所以我们感觉进程应该是立马处理了我们发送信号啊,怎么是待会儿处理这个信号呢?...除我们主动调用系统调用或通过键盘发送指令外,软件本身其实也可以自发发送信号,比如这个部分所讲硬件异常导致软件自发发送信号。...,键盘kill或组合热键不是通过kill系统调用吗?...此时内核态身份还正好执行这样恶意攻击访问内核资源代码,这不完蛋了吗?

    1.6K10

    Linux信号保存和处理

    POSIX.1允许系统递送该信号一次或多次。Linux是这样实现:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。...#include int sigpending(sigset_t *set); 调用成功则返回0,出错则返回-1 案例测试 场景:将2号信号屏蔽,再给当前进程发送2号信号,但是2号信号已经被屏蔽...键盘输入数据过程 先看硬件: CPU不会和键盘等外设打交道,键盘通过芯片会向CPU发送一个硬件中断(是硬件结构),键盘有自己中断号,键盘会给CPU针脚发送高电平,此时CPU就会读取中断号,将中断号放在寄存器中...CPU将寄存器里值在函数指针数组中索引,CPU会执行读取键盘方法,读取到内存指定区。 另外这个函数指针数组在硬件层面上叫做中断向量表。...内核和用户 在Linux操作系统中,用户态(User Mode)和内核态(Kernel Mode)是两种不同执行级别,它们定义了程序(包括操作系统内核和用户程序)权限和访问资源能力。

    7510

    Linux】详解信号分类&&如何自定义信号作用

    一、信号定义         Linux系统提供让用户(进程)给其他进程发送异步信息一种方式。在操作系统中,信号是一种进程间通讯有限制方式,主要用于提醒进程某个事件已经发生。...信号在Unix、类Unix以及其他POSIX兼容操作系统中广泛应用。它作为一种异步通知机制,当发送给一个进程时,操作系统会中断该进程正常控制流程。...二、信号分类 kill -l//查看系统中所存在信号 我们可以看到每一个信号对应一个信号和一个宏名称,以后我们给进程发送信号既可以采用发送数字形式也可以采用发送宏名称方式。 ...3.1、收到该信号进程处理我交给它任务         捕捉信号函数为signal函数, 其中第一个参数就表示你要给进程发送第几号信号,第二个参数handler就是我们所写函数,即我们要让进程在收到对应信号时所要执行动作...,我这个进程会一直正常打印:  当我给这个进程发送一条二号指令时  该进程收到了2号信号,但已经不再执行原来终止进程操作,转而执行我交给它动作。

    29510

    Linux】详解信号产生方式

    二、键盘产生信号 不同操作系统产生信号键盘组合键可能不同,这里说是ubuntu系统下。常见键盘产生信号有: ctrl + c:向当前进程发送2号信号。...abort系统调用函数就是一个用来给进程自己发送6号信号系统调用函数。 四、软件条件产生信号 在操作系统中,由软件条件产生信号通常指的是通过某种软件操作或系统状态触发信号。...下面会说明常见软件条件: 4.1、管道通信 【Linux】匿名管道实现简单进程池-CSDN博客之前在这一篇博客中,我已经介绍了进程间使用管道通信四种情况和五种特性,其中在第四种情况中,我曾经说过,读端关闭了...,操作系统就会发送信号直接杀死进行写入进程,因为没有读端写入也就没有了意义。...五、异常产生信号 常见进程出异常产生信号有除0异常,操作系统会向进程发送8号信号(SIGFPE)。野指针,操作系统会向进程发送11号信号(SIGSEGV)。

    12510

    linux | kill命令详解以及linux信号

    简介# kill命令很容易让人产生误解, 以为仅仅是用来终止linux进程....在man手册中对kill命令解释如下, 不难看出, kill命令是一个用于将指定signal发送给进程工具 DESCRIPTION The command kill sends the specified..., 在这些信号中只有9) SIGKILL可以无条件地终止process, 其他信号都将依照process中定义信号处理规则来进行忽略或者处理....上述信号中常用其实很少, 如下表所示 编号 名称 解释 1 SIGHUP 启动被终止程序, 也可以让进程重新读取自己配置文件, 类似重新启动 2 SIGINT 相当于输入 ctrl-c 来中断一个程序...常用命令# 以正常方式终止进程, 由于信号15是最常用也是最佳程序退出方式, 所以 kill 命令不指定信号时, 默认使用就是信号 15 kill pid # 或者 kill -15 pid 强制终止进程

    2.6K60

    JavaMail邮件发送-发送附件和带背景音乐邮件小系统

    这里使用是JavaMail技术,前台使用了fckeditor做邮件美化,由于只是示例,后台发送时只是将邮件保存在本地,但是可以查看,如果需要实际发送,请参考我其他博客文章,我写了很多关于邮件发送示例...---- 发送一封简单 E-mail 下面是一个发送简单E-mail例子。假设你本地主机已经连接到网络。 SendEmail.java 文件代码: ? ?...发送一封 HTML E-mail 下面是一个发送 HTML E-mail 例子。假设你本地主机已经连接到网络。...编译并运行此程序来发送HTML e-mail: $ java SendHTMLEmailSent message successfully.... ---- 发送带有附件 E-mail 下面是一个发送带有附件...假设你本地主机已经连接到网络。 SendFileEmail.java 文件代码: ? ? 编译并运行你程序来发送一封带有附件邮件。

    1.1K30
    领券