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

Linux编程中关于信号捕获“--”和新建函数体空格问题讨论

最近在学习《Linux命令行和shell脚本编程大全》(第四版)这本书,对于自己遇到问题以及通过搜索引擎和书籍中解决方案进行一个案例剖析,希望对于像我这样初学者,有一个帮助。...1 关于信号捕获 trap - 与 trap --在第16章 《脚本控制》16.1.5节中关于修改或移除信号捕获中有如下描述:那么我在复述该脚本时候,如下:[root@iZuf6gxtsgxni1r88kx9rtZ...#Loop 5.The trap is been removed.Second loop 1^C这里其实说明两个问题:利用trap取消信号捕获设置时,可能不同系统有不同模式,--以及-都是可以关于信号描述...SIGINT不区分大小写,大写也可,小写也会正常捕获。...) {函数体}以下是我复述例子:[root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# cat func_status2.sh #!

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

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

    这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息载体,是Linux/UNIX 环境下,古老而经典通信方式, 现在依然是主要通信手段。...3.3 信号处理方式 执行默认动作 忽略(丢弃) 捕捉(调用户处理函数),捕获可以说是学习信号最重要原因之一,当我们程序产生比如段错误、总线错误等等,程序会异常终止,我们通过捕获可以捕获到这种错误...未决信号集: 信号产生,未决信号集中描述该信号位立刻翻转为1,表信号处于未决状态;当信号处理对应位翻转回为0,这一时刻往往非常短暂。...未决信号集就是没有处理信号,未决信号集实际上是一个32位数,每一位代表一个信号,当信号产生时候,就把对应位反转为1,如果该信号未被处理就反转回0,处理了就保持为1。...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中信号

    8510

    Linux信号】三:信号捕捉

    注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本Unix和不同版本Linux中可能有不同行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_mask 调用信号处理函数时,所要屏蔽信号集合(信号屏蔽字)。注意:仅在处理函数调用期间屏蔽生效,是临时性设置。实际上就是执行捕捉函数期间临时屏蔽信号集。...某个信号sig捕捉函数执行期间,sig信号自动屏蔽。 阻塞常规信号不支持排队,如果产生多次,只记录一次。...实际上是这样,未决信号集中使用某一位0和1来记录信号是否处理,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...执行完信号处理函数后通过系统调用sigreturn再次陷入内核,然后返回用户态从中断地方继续执行主控制逻辑。

    13510

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

    忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来整个过程,对你来讲是异步,你不能准确断定快递员什么时候给你打电话 Linux信号Linux操作系统中通过kill -l命令可查看所有的信号...: 信号是从1号开始,从信号1到信号31是普通信号,从信号35到信号64称之为实时信号,一般不考虑实时信号。...信号Linux系统提供一种向指定进程发送特定事件一种方式,系统在收到信号时会做识别和处理。...信号产生是异步信号产生和目标进程运行是两条线,信号可以在程序任意时刻产生,并且会打断当前正在执行代码,转而执行信号处理函数。...异常产生信号 硬件异常被硬件以某种方式硬件检测到并通知内核,然后内核向当前进程发送适当信号

    7410

    第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件流程推进

    本篇即介绍在不同情况下,流程自动推进方法。主要是三种: ①ReceiveTask接收信号后往前执行; ②中间信号捕获事件接收信号后往前执行; ③中间消息捕获事件接收消息后往前执行。...来进行触发(此处bpmn使用是ReceiveTask来接收触发,经测试UserTask不能) runtimeService.trigger(execution.getId()); //再次查询当前执行流...三、中间信号捕获事件 bpmn如下: ? xml需要添加信号定义,才能在发送该信号后,事件能捕获到。 <!...五、总结 bpmn文件中 中间信号捕获事件 和 中间消息捕获 事件使用都是同一个控件,区别是一个使用信号定义,一个是消息定义。...中间信号捕获事件中发送信号使执行流继续执行(可以不指定执行流id),而中间消息捕获事件中发送消息必指定执行流id,由此得出:信号可以是广播处理,消息是一对一

    2.1K40

    Linux信号处理

    3 键盘输入数据过程 操作系统如何知道我们按下键盘呢?肯定不能是每一时刻都进行检查,这样消耗太大!...来看Linux内核: 在操作系统主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...当然如果把所有信号都屏蔽了,肯定是不行,所以有一部分信号不能屏蔽,比如9号信号永远都不能屏蔽!!!...这就叫做insert函数重入了!!! 在重入过程中一旦造成了问题,就叫做不可重入函数!!!(因为一旦重入就造成了问题,那当然不能重入了) 绝大部分函数都是不可重入函数!...volatile关键字 我们今天在信号角度再来重温一下: volatile 作用:保持内存可见性,告知编译器,该关键字修饰变量,不允许优化,对该变量任何操作,都必须在真实内存中进行操作保持数据可见性

    8810

    Linux信号保存

    是对应6号信号(终止会打印Aborted!)其特殊性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能自定义捕捉!!!...再次注意: 阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作....对信号操作 我们认识了内核数据结构中三张表,那么如果对它们进行操作呢?Linux操作系统为我们提供了用户级别的位图!...sigset_t是Linux操作系统提供一个用户级数据类型,禁止用户直接修改位图!!!...解除屏蔽,一般会立刻处理当前解除信号(如果处于pending中) pending位图中对应信号也要被清零!那是递达之前还是递达之后呢?

    8410

    Linux笔记(15)| Linux信号

    今天要分享Linux信号机制,信号是一种软件中断,是一种处理异步事件方法,可以很好地在多个进程之间进行同步和简单数据交换。...二、信号注册和响应 前面讲了三种发送信号方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。...signal函数第一个参数是信号类型,第二个参数是函数指针,也就是跳转到哪里去执行。也就是说,当收到第一个参数表示信号之后,就会跳转到第二个参数指向代码段去执行。...成员sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号更详细信息。...接下来写一个简单代码,来应用一下上面的几个函数。实现需求就是创建一个子进程,父进程每隔一秒钟向子进程发送一个信号,子进程收到信号之后往一个txt文档中写入一句话。

    2.6K10

    Linux】 进程信号发生

    1 何为信号 生活中信号随处可见,我们生活离不开信号。...我们可以看看在Linux系统下信号信号时从 1 - 64 数字对应信号(32 - 64 是实时信号,暂不考虑) 信号生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念基础储备 信号Linux系统通过一种向目标进程发送指定事件方式。要做识别和处理。...是对应6号信号(终止会打印Aborted!)其特殊性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能自定义捕捉!!!...core : 异常终止,但是会形成一个debug文件(默认在云服务器是关闭) term : 直接异常终止 debug文件是什么,我们一起看看: 首先默认是不能创建,我们要进行一个修改:

    9710

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

    阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作。 注意:阻塞和忽略是不同,只要信号阻塞就不会递达,而忽略是在递达之后可选一种处理动作。...在上图中,三个数组(前两张位图也可以看成数组)应该横着看,依次表示该信号是否阻塞,是否收到该信号,以及执行该信号处理方法。...3.1、信号集操作函数 sigset_t虽然是一种数据类型,但是我们并不能直接手动修改sigset_t类型值,必须要调用对应系统调用函数。...我们设置完信号集set值后,set并没有设置进进程PCB中,还需要我们调用系统调用函数设置。...,程序到20秒时退出: 四、总结 31个信号中并不是所有信号都可以屏蔽掉,9号信号(SIGKILL)和19号信号(SIGSTOP)是无法屏蔽掉

    9810

    Linux】详解用户态和内核态&&内核中信号处理时机&&sigaction信号自定义处理方法

    在这种状态下,进程只能访问受限系统资源,并且不能执行某些特权操作。用户态下进程没有权限直接访问硬件或执行某些敏感系统调用。它们必须通过系统调用接口来请求内核态服务。...在这三种情况下,操作系统都会保存用户态上下文,并在内核态下处理这些事件。 二、信号处理时机  如下图所示,进程从内核态切换回用户态时候,信号会被检测并处理。...在内核中,所有的系统调用函数其实是用一个函数指针数组所管理起来,该函数指针数组会通过页表映射与1G内核空间某些虚拟地址建立起映射关系,这样当正文代码部分要调用某个系统调用函数时,只需要拿着虚拟地址在内核空间中寻找再通过页表映射就可以在内存中找到该系统调用函数...既然操作系统已经映射到我们进程地址空间上,那是否意味着我们可以随便访问操作系统中内容了呢?答案肯定不是的。...pending位图中没有2号信号,再次发送2号信号发现pending位图中有2号信号,证明2号信号屏蔽了,因为进程在处理某个信号时如果再次给它发送同一个信号信号会被自动屏蔽,依次再向进程发送3,4,5

    13400

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

    信号是发送给进程,那么进程能不能先不处理这个信号呢?比如当前进程正在处理别的信号,或者进程此时挂起了并未处于运行状态,那么如果这个时候操作系统给进程发送信号呢?进程都不运行了,还处理啥信号啊?...就像C++异常一样,那么多异常种类,在捕获异常之后,进程不都终止了吗?那还要那么多异常干什么啊?...,不能自己随意访问内核或硬件资源。...,等到系统调用结束之后,当然也不能以内核态身份去执行用户态代码,因为用户态代码有可能恶意利用去攻击操作系统,而内核态执行权限大,所以在系统调用结束后,为防止发生意外,进程运行级别还需要由内核态切换为用户态...在信号递达处理期间,同类型信号会被OS自动添加到信号屏蔽字当中,当信号完成递达后,OS会自动解除对该信号屏蔽。所以进程处理同类型信号原则是串行处理同类型信号不能递归式进行处理。

    1.6K10

    Linux信号保存和处理

    没有关系, 阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作....SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。虽然它处理动作是忽略,但在没有解除阻塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞。...POSIX.1允许系统递送该信号一次或多次。Linux是这样实现:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。...注意: 解除屏蔽一般会立即处理当前解除信号 在递达之前,pending位图对应信号清0 信号处理 处理信号就是递达信号,在上面我们处理信号使用是signal函数: signal(2,handler...显然,这也是一个回调函数,不是main函数调用,而是系统所调用。 实例: 当前如果正在对2号信号进行处理,默认2号信号会被自动屏蔽,对2号信号处理完成时候,会自动解除对2号信号屏蔽。

    7310

    Linux】详解信号产生方式

    SIGQUIT(3号信号): 终止进程并产生core文件,用于后续分析程序崩溃时状态和数据。 SIGKILL(9号信号):强制终止信号不能进程捕获或阻塞,用于强制结束进程。...SIGSTOP(20号信号):停止信号,使进程停止执行,直到收到SIGCONT信号。 SIGCONT(18号信号):继续信号,使之前SIGSTOP信号停止进程继续执行。...二、键盘产生信号 不同操作系统产生信号键盘组合键可能不同,这里说是ubuntu系统下。常见键盘产生信号有: ctrl + c:向当前进程发送2号信号。...abort系统调用函数就是一个用来给进程自己发送6号信号系统调用函数。 四、软件条件产生信号 在操作系统中,由软件条件产生信号通常指的是通过某种软件操作或系统状态触发信号。...下面会说明常见软件条件: 4.1、管道通信 【Linux】匿名管道实现简单进程池-CSDN博客之前在这一篇博客中,我已经介绍了进程间使用管道通信四种情况和五种特性,其中在第四种情况中,我曾经说过,读端关闭了

    12510
    领券