signal

信号

匿名 (未验证) 提交于 2019-12-03 00:22:01
来自: https://blog.csdn.net/dawn_sf/article/details/74177899 信号与中断的区别: 信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; (3)都在处理完毕后返回到原来的断点; (4)对信号或中断都可进行屏蔽。 信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在 用户态 下运行的,而中断处理程序是在 核心态 下运行; (3)中断响应是及时的,而信号响应通常都有较大的时间延迟。 在Linux下当我们想强制结束一个程序的时候,我们通常会给它发送一个信号然后该进程捕捉到信号,再然后该进程执行一定操作最 终 被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一 个错 误产生 的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生 成,接收到一个信号叫捕获。信号的捕捉这篇可能不会详细的说到,因为我想给它专门讲一个博客,因为信号捕捉的实例也是蛮多 的. 首先我们认识一下这些信号: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5)

signal ()函数

匿名 (未验证) 提交于 2019-12-03 00:22:01
1. 功能 设置某一信号的对应动作 2. 声明 #include <signal.h> typedef void (*sighandler_t)( int ); sighandler_t signal ( int signum, sighandler_t handler); 3. 参数说明     (1)SIG_IGN    例如: #include <stdio.h> #include <signal.h> int main( int argc, char *argv[]) { signal (SIGINT, SIG_IGN); while ( 1 ); return 0 ; } SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。执行上述代码时,按下CTRL + C程序没有反应。这就对了,如果我们想结束该程序可以按下CTRL +\来结束,当我们按下CTRL +\组合键时,产生了SIGQUIT信号,此信号并没有被忽略。 (2)SIG_DFL    例如 #include <stdio.h> #include <signal.h> int main( int argc, char *argv[]) { signal (SIGINT, SIG_DFL); while ( 1 ); return 0 ; } 这时就可以按下CTRL +C

进程间通信:信号

匿名 (未验证) 提交于 2019-12-03 00:22:01
一、信号产生、处理、分类 二、signal信号处理机制 五、信号相关函数 六、计时器 信号就像古代战场上打仗,摇什么旗子摆什么阵。双方已经约定好。能不使用信号就不要使用信号,因为是异步。 信号是硬件中断的软件模拟(软中断)。 需要掌握:1到31号信号。 ------------------------------------------------------------------------------------------------------------------------------------------------------------- 信号的产生: 信号的生成来自内核 ,让内核生成信号的请求来自3个地方: 1.用户:用户能够通过输入CTRL+c、Ctrl+\,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号; 3.进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。 信号的处理: 进程接收到这两个信号后,只能接受系统的默认处理,即终止进程. 钩子:回调函数 默认处理的话,一般会把程序搞崩溃。 进程事先注册信号处理函数。当信号来了的时候 信号的分类: 同步信号:由进程的某个操作产生的信号,例如除0、内存访问违规; 异步信号:由像用户击键这样的进程外部事件产生的信号,再如,ctrl+z.

QT中 QObject::sender():

匿名 (未验证) 提交于 2019-12-03 00:04:02
QT中 QObject::sender(): 1、功能:用于返回发送信号的对象的指针,返回类型为QObject *。当某一个Object emit一个signal的时候,它就是一个sender, 系统会记录下当前是谁emit出这个signal的。你在一个槽里面调用这个函数,就知道是谁触发了这个槽并且可对发信号的对象进行操作。 2、可以解决的问题:可用于一个槽函数接收多个信号,通过sender判断是哪个对象发的信号。 示例代码: ///假如有button1和button2同时连接到该槽 void Widget::Slot_On_Clicked() { QObject * obj = sender(); //返回发出信号的对象,用QObject类型接收 QPushButton *button_tmp = qobject_cast<QPushButton *>(obj); //向下转型为按钮类型 //或者 QPushButton *button_tmp = (QPushButton*) sender(); //强制转换 QString m_ObjectName = button_tmp->text(); //调用发信号者的方法 ///判断是哪个按钮 if(m_ObjectName.compare(QStringLiteral("pushButton_1"))==0) { qDebug()

C++ 信号处理

匿名 (未验证) 提交于 2019-12-02 23:43:01
免费C 语言教程: 阿里云大学――开发者课堂 信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。 有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C++ 头文件 <csignal> 中。 信号 描述 SIGABRT abort 。 SIGFPE 错误的算术运算,比如除以零或导致溢出的操作。 SIGILL 检测非法指令。 SIGINT 接收到交互注意信号。 SIGSEGV 非法访问内存。 SIGTERM 发送到程序的终止请求。 signal() 函数 C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法: void (*signal (int sig, void (*func)(int)))(int); 这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。 让我们编写一个简单的 C++ 程序,使用 signal() 函数捕获 SIGINT 信号。不管您想在程序中捕获什么信号,您都必须使用 signal 函数来注册信号,并将其与信号处理程序相关联。看看下面的实例: #include <iostream>#include

Python之signal模块详解

匿名 (未验证) 提交于 2019-12-02 22:51:30
先简单说一下Signal是啥.(如果想直接使用可以不看) Signal翻译过来中文就是信号- - 当然, 本身他就是Linux系统编程中非常重要的概念, 信号机制是进程之间传递消息的一种机制, 其全称为软中断信号 作用是通知进程发生了异步事件。进程之间可以调用系统来传递信号, 本身内核也可以发送信号给进程, 告诉该进程发生了某个事件. 注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。 接收信号的进程对不同的信号有三种处理方法 指定处理函数 忽略 根据系统默认值处理, 大部分信号的默认处理是终止进程 然后就是一大段类型了.. Linux系统有两大类信号 POSIX标准的规则信号(regular signal 1-31编号) 实时信号(real-time signal 32-63) 规则信号 信号编号 名称 默认动作 说明 1 SIGHUP 终止 终止控制终端或进程 2 SIGINT 终止 由键盘引起的终端(Ctrl-c) 3 SIGQUIT dump 控制终端发送给进程的信号, 键盘产生的退出(Ctrl-\), 4 GIGILL dusmp 非法指令引起 5 SIGTRAP dump debug中断 6 SIGABRT/SIGIOT dump 异常中止 7 SIGBUS/SIGEMT dump 总线异常/EMT指令 8 SIGFPE dump 浮点运算溢出 9

PHP进程信号处理

匿名 (未验证) 提交于 2019-12-02 22:10:10
PHP进程信号处理   php有一组进程控制函数PCNTL,使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。 注意:pcntl这个扩展仅在cli/cgi模式下可用。mod_php和php-fpm中不可以使用。在web server环境中不要使用这组函数,因为会导致不可预料的结果。另,windows作为非类unix系统,没有这些函数。   PCNTL 使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。 下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:   其实官方的pcntl_signal性能极差,主要是PHP的函数无法直接注册到操作系统信号设置中,所以pcntl信号需要依赖tick机制来完成。 pcntl_signal的实现原理是,触发信号后先将信号加入一个队列中。然后在PHP的ticks回调函数中不断检查是否有信号,如果有信号就执行PHP中指定的回调函数,如果没有则跳出函数。 ticks=1表示每执行1行PHP代码就回调此函数

浅谈Linux 信号(Signal)

匿名 (未验证) 提交于 2019-12-02 21:59:42
1.在linux用命令 kill -l 查看系统信号 2.前32个信号是unix经典信号,后32为实时信号(自定义信号) 3.前台进程永远只有一个,后台进程可以有n个 4 用用命令ctl+c 可以结束唯一一个后台进程 5.产生信号的几种方式 alarm()定时器向内核发送当前进程发送SIGALRM信号 信号的传递过程: 注意:unix经典信号不支持排队,但是实际上最多支持一次排队(因为内核可帮助设置临时屏蔽字) 临时屏蔽字的作用:为了避免在处理信号的自定义动作干扰,当执行完捕捉动作后,该屏蔽解除 屏蔽字的三种设置方式: 信号捕捉的执行过程: 文章来源: 浅谈Linux 信号(Signal)