signal信号

python blinker库

醉酒当歌 提交于 2020-03-23 19:04:30
Blinker 是一个基于Python的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播。Flask的信号机制就是基于它建立的。 Blinker的内核虽然小巧,但是功能却非常强大,它支持以下特性: 支持注册全局命名信号 支持匿名信号 支持自定义命名信号 支持与接收者之间的持久连接与短暂连接 通过弱引用实现与接收者之间的自动断开连接 支持发送任意大小的数据 支持收集信号接收者的返回值 线程安全 创建信号 信号通过 signal() 方法进行创建: >>> from blinker import signal >>> initialized = signal("initialized") >>> initialized is signal("initialized") True 每次调用 signal('name') 都会返回同一个信号对象。因此这里 signal() 方法使用了单例模式。 订阅信号 使用 Signal.connect() 方法注册一个函数,每当触发信号的时候,就会调用该函数。该函数以触发信号的对象作为参数,这个函数其实就是信号订阅者。 >>> def subscriber(sender): ... print("Got a signal sent by %r" % sender) ... >>> ready = signal('ready') >

Linux Signal

*爱你&永不变心* 提交于 2020-03-04 08:07:07
哪些情况会引发信号 1.键盘事件 ctrl +c ctrl +\ 2.非法内存 如果内存管理出错,系统就会发送一个信号进行处理 3.硬件故障 同样的,硬件出现故障系统也会产生一个信号 4.环境切换 比如说从用户态切换到其他态,状态的改变也会发送一个信号,这个信号会告知给系统 进程表的表项中有一个软中断信号域,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。 内核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。这里要补充的是,如果信号发送给一个正在睡眠的进程,那么要看 该进程进入睡眠的优先级,如果进程睡眠在可被中断的优先级上,则唤醒进程;否则仅设置进程表中信号域相应的位,而不唤醒进程。这一点比较重要,因为进程检 查是否收到信号的时机是:一个进程在即将从内核态返回到用户态时;或者,在一个进程要进入或离开一个适当的低调度优先级睡眠状态时。 运行如下命令,可看到Linux支持的信号列表: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15)

DBus API的使用(讲的很清晰)

我是研究僧i 提交于 2020-02-29 11:21:36
转自 DBus 入门与应用--基本概念 上(C API 级别的使用观点) 、 DBus 入门与应用--基本概念 下(C API 级别的使用观点) 转载请注明出处 作者: 唐风 DBus是用来进行进程间通信的。下面这张图展示了一些DBus的大部分东西,但是它太复杂了: DBus 本身是构建在 Socket 机制之上。真正的通信还是由 Socket 来完成的。DBus 则是在这之上,制定了一些通信的协议,并提供了更高一层的接口,以更方便应用程序之间进行数据的交互。 在DBus的体系中,有一个常驻的进程 Daemon,所有进程间的交互都通过它来进行分发和管理。所有希望使用 DBus 进行通信的进程,都必须事先连上 Daemon,并将自己的名字注册到 Daemon 上,之后,Daemon会根据需要把消息以及数据发到相应的进程中。 首先使用 1 conn = dbus_bus_get(DBUS_BUS_SESSION, &err); 让应用程序和 DBus 之间取得连接。之后,使用函数 1 ret = dbus_bus_request_name(conn, " test.method.server " , 2 DBUS_NAME_FLAG_REPLACE_EXISTING 3 , &err); 将自己的进程名字注册到 Daemon 上。(参考前篇的[共通用代码])。这样通信就有了基础了。

进程间通信---信号

僤鯓⒐⒋嵵緔 提交于 2020-02-28 18:18:11
信号的概念 信号在我们的 生活中随处可见, 如:古代战争中摔杯为号;现代战争中的信号弹;体育比赛中使用的信号枪 ...... 他们都有共性: 1. 简单 2. 不能携带大量信息 3. 满足某个特设条件才发送。 信号是信息的载体, Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。 Unix 早期版本就提供了信号机制,但不可靠,信号可能丢失。 Berkeley 和 AT&T 都对信号模型做了更改,增加了可靠信号机制。但彼此不兼容。 POSIX.1 对可靠信号例程进行了标准化。 信号的机制 A 给 B 发送信号, B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。 每个进程收到的所有信号,都是由内核负责发送的。 与信号相关的事件和状态 产生信号 : 1. 按键产生,如: Ctrl+c 、 Ctrl+z 、 Ctrl+\ 2. 系统调用产生,如: kill 、 raise 、 abort 3. 软件条件产生,如:定时器 alarm 4. 硬件异常产生,如:非法访问内存 ( 段错误 ) 、除 0( 浮点数例外 ) 、内存对齐出错 ( 总线错误 ) 5. 命令产生,如: kill 命令 递达 :递送并且到达进程。

c 信号处理

本小妞迷上赌 提交于 2020-02-13 12:55:13
1. 使用signal(int signal, function)向内核注册信号处理函数 2. 使用raise()向本进程发送信号,通过kill()向其他进程发送信号 #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> void signal_handle(int signal); int main(int argc, char **argv) { signal(SIGUSR1, signal_handle); int cpid, ppid; if ((cpid = fork()) == 0) { ppid = getppid(); cpid = getpid(); printf("cid:%d, ppid:%d\n", cpid, ppid); kill(ppid, SIGUSR1); printf("send signal to parent\n"); } else { int pid = wait(NULL); printf("pid after wait:%d\n", pid); } } void signal_handle(int signal) { printf("receive signal:%d\n", signal); }    来源: https://www

Qt Connect 信号 槽

左心房为你撑大大i 提交于 2020-01-29 12:37:07
   信号和槽机制是 QT 的核心机制 。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具 ,该工具是一个 C++ 预处理程序 , 它为高层次的事件处理自动生成所需要的附加代码。 在QT中, connect()函数是关联部件的动作与执行的函数。   在启动函数中进行设置,并非是在信号槽函数中进行设置。也就是一启动就关联好,如果放在信号槽中,则进行第一次动作,进行关联,第二次才能实行执行的函数。 同时,connect()函数中的SLOT()中的槽函数,必须在头文件定义中需要放在public slot或者private slot函数中。否则不能实现,编译错误。  信号和槽能携带任意数量和任意类型的参数(类型要匹配),他们是类型完全安全的,不会像回调函数那样产生 core dumps。   所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用

Linux信号(signal)机制

自作多情 提交于 2020-01-25 22:07:20
信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一、信号类型 Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。 1.1 概念 不可靠信号: 也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31; 可靠信号: 也称为实时信号,支持排队, 信号不会丢失, 发多少次, 就可以收到多少次. 信号值取值区间为32~64 1.2 信号表 在终端,可通过 kill -l 查看所有的signal信号 取值 名称 解释 默认动作 1 SIGHUP 挂起 2 SIGINT 中断 3 SIGQUIT 退出 4 SIGILL 非法指令 5 SIGTRAP 断点或陷阱指令 6 SIGABRT abort发出的信号 7 SIGBUS 非法内存访问 8 SIGFPE 浮点异常 9 SIGKILL kill信号 不能被忽略、处理和阻塞 10 SIGUSR1 用户信号1 11 SIGSEGV 无效内存访问 12 SIGUSR2 用户信号2 13 SIGPIPE 管道破损,没有读端的管道写数据 14 SIGALRM alarm发出的信号 15 SIGTERM 终止信号 16 SIGSTKFLT 栈溢出 17 SIGCHLD 子进程退出 默认忽略 18

Nodejs之cluster

只谈情不闲聊 提交于 2020-01-23 05:20:59
cluster 集群 单个Nodejs实例运行在单个线程中,为充分利用多核系统,需要启用一组Node进程处理负载任务。 cluster允许建立一个主进程和若干个worker进程,由主进程监控和协调worker进程的运行。 worker之间采用进程通信交换消息,cluster模块内置一个负载均衡。 cluster集成两个方面: 集成了child_process.fork方法创建node子进程的方式; 继承了很多多核cpu创建子进程后,自动控制负载均衡的方式; cluster模块可以创建共享服务器端口的子进程。 const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`主进程 ${process.pid} 正在运行`); // 衍生工作进程。 for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`工作进程 ${worker.process.pid} 已退出`); }); }

每周一个 Python 标准库 | signal

拥有回忆 提交于 2020-01-21 22:54:34
技术博客:https://github.com/yongxinz/tech-blog 同时,也欢迎关注我的微信公众号 AlwaysBeta ,更多精彩内容等你来。 信号是 Unix 系统中常见的一种进程间通信方式(IPC),例如我们经常操作的 kill -9 pid ,这里的 -9 对应的就是 SIGKILL 信号,9 就是这个信号的编号,SIGKILL 是它的名称。 由于不同版本的 *nux 的实现会有差异,具体请参照系统 API,可以使用 man 7 signal 查看所有信号的定义。 那么,信号有哪些使用场景呢?与其他进程间通信方式(例如管道、共享内存等)相比,信号所能传递的信息比较粗糙,只是一个整数。但正是由于传递的信息量少,信号也更便于管理和使用,可以用于系统管理相关的任务。例如通知进程终结、中止或者恢复等。每种信号用一个整型常量宏表示,以 SIG 开头,比如 SIGCHLD、SIGINT 等。 接收信号 Python 中使用 signal 模块来处理信号相关的操作,定义如下: signal . signal ( signalnum , handler ) signalnum 为某个信号,handler 为该信号的处理函数。进程可以无视信号,可以采取默认操作,还可以自定义操作。当 handler 为 signal.SIG_IGN 时,信号被无视(ignore);当

webrtc 信号槽实现分析

爱⌒轻易说出口 提交于 2020-01-14 01:07:58
前言 从网上看到的另一句话,webrtc中的信号槽像是变种的观察者模式,当有信号发送的时候,信号发送者通过遍历自己的所有connect的信号槽,然后执行他们的回调;起初会有为什么需要信号槽 信号槽与普通的函数回调有什么区别的疑问, 个人认为信号槽是一种面向对象的回调,当回调涉及到对象,需要考虑到执行对象的生命周期,信号槽这种变种的观察者模式,在接收信号的对象析构导致信号槽析构的时候,会将注册的信号删除(就像是删除注册了的观察者),很好的将信号和其对象的生命周期进行了绑定管理。 正文 一个例子 从网上拿了XXDK使用webrtc信号槽的例子,如下: /************************************************************************* > File Name: main.cpp > Author: > Email: v.manstein@qq.com > Created Time: Fri 31 Aug 2018 09:38:20 AM CST ************************************************************************/ #include<iostream> #include"sigslot.h" #include<unistd.h> #include