signal

编程小知识之 虚假唤醒(spurious wakeup)

此生再无相见时 提交于 2019-12-17 08:36:52
本文简单介绍了一些 虚假唤醒(spurious wakeup) 相关的知识 (注: 本文假设读者对多线程开发有一定了解) 高层次的多线程编程中, 条件变量 是个常见的同步方法,跟传统仅使用 互斥量 的方法相比,条件变量可以减少锁的竞争. 拿 Pthread 举例,一个常见的条件变量的使用示例大概是这个样子的: // flag for sync bool g_signaled = false; pthread_mutex_t g_mutex; pthread_cond_t g_cond; // wait method void wait() { pthread_mutex_lock(&g_mutex); while (!g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } g_signaled = false; pthread_mutex_unlock(&g_mutex); } // signal method void signal() { pthread_mutex_lock(&g_mutex); g_signaled = true; pthread_mutex_unlock(&g_mutex); pthread_cond_signal(&g_cond); } 代码中调用的 pthread_cond_wait 方法

五大I/O模型详解

陌路散爱 提交于 2019-12-15 20:19:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 同步与异步&阻塞与非阻塞 五大I/O模型详解 java I/O模型简述 前文 在 同步与异步&阻塞与非阻塞 中,简要的介绍一些基础概念,但这些概念最终是为IO所服务,是为文件所服务。按照Linux一句话来说,一切皆文件。 一、Unix IO模型 Unxi大师Richard Stevens在 UNIX® Network Programming 中讲述了五种I/O 模型 blocking IO nonblocking IO IO multiplexing signal driven IO asynchronous IO 而本文也是基于这五种I/O模型,以及交叉着同步与异步&阻塞与非阻塞的概念。但在探讨I/O模型之前,先要了解一下I/O模型发生的对象和步骤。 对于一个文件IO的操作(这里以read为例子),会涉及到两个对象: 一个是调用这个IO的进程process 另外一个就是系统内核kernel 当一个read操作发生时,会经历两个阶段 进程等待内核数据准备(Waiting for the data to be ready) 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process) 二、五大I/O模型 1.blocking IO(阻塞IO) 1.1

语音信号处理Kaldi ToolKit 和VoiceBox

耗尽温柔 提交于 2019-12-10 15:59:13
1. Ubuntu上安装Kaldi ToolKit 安装git i) git --version ii) sudo apt install git iii) git –version : 2.7.4 ix) git config --global user.name “git” x) git config --global user.email zhaodpx@163.com xi) git config --list xii) git init xiii) git init newrepo 安装Kaldi Toolkit 主要参考: http://kaldi-asr.org/doc/install.html Git主页: https://github.com/tzyll/kaldi git clone https://github.com/kaldi-asr/kaldi.git kaldi --origin upstream 下载后,所需操作为: http://kaldi-asr.org/doc/tutorial_setup.html cd kaldi/tools/; make; cd ../src; ./configure; make 第一步:cd kaldi/tools/ 第二步:make,显示: zhaodeng@ubuntu:~/kaldi/tools$ make

dbus-python 指南

馋奶兔 提交于 2019-12-09 11:41:19
本文系转载,原文出处: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://fanrenhao.blog.51cto.com/3961213/807935 This tutorial requires Python 2.4 or up, and dbus-python 0.80rc4 or up. 指南需要:Python 2.4 或更高的版本, dbus-python 0,80rc4或更高的版本 Connecting to the Bus (连接Bus) Making method calls (制造一个方法调用) Proxy objects (代理对像) interfaces and methods (接口和方法) See also Data types (数据类型) Basic types (基本类型) Basic type conversions (基本类型约定) Container types (容器类型) Return values , and the byte_arrays and utf8_strings options (返回值, byte_arrays 和 utf8_strings 选项) Making asynchronous method calls (使用异步方法调用) Setting up

Signal处理中的函数可重入问题

偶尔善良 提交于 2019-12-07 07:44:05
1. Signal信号简介 信号是软件层次上模拟的中断,它是一种异步通信的处理机制。信号的异步性意味着,应用程序不用等待事件的发生,当信号发生时应用程序自动陷入到对应的信号处理函数中。产生信号的事件对进程而言是随机出现的。信号的响应方式有忽略、捕捉、执行默认动作三种。 2. 线程安全 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。使用全局变量的函数是非线程安全的。使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。 线程安全的(Thread-Safe):如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。 3. 可重入 可重入(Reentrant)函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。 1) 一个函数对于多个线程是可重入的,则这个函数是线程安全的; 2) 一个函数是线程安全的,但并不一定是可重入的,比如使用互斥锁实现的线程安全; 3) 可重入性要强于线程安全性。 4. Signal信号处理 信号处理函数中只能调用可重入函数,而不能调用不可重入函数。进程捕捉到信号并对其进行处理时

DBUS基础知识

*爱你&永不变心* 提交于 2019-12-06 08:18:48
1. 进程间使用D-Bus通信 D-Bus是一种高级的进程间通信机制,它由freedesktop.org项目提供,使用GPL许可证发行。D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。D-Bus的主要概率为总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。目前,D-Bus已被大多数Linux发行版所采用,开发者可使用D-Bus实现各种复杂的进程间通信任务。 2. D-Bus的基本概念 D-Bus是一个消息总线系统,其功能已涵盖进程间通信的所有需求,并具备一些特殊的用途。D-Bus是三层架构的进程间通信系统,其中包括: 接口层:接口层由函数库libdbus提供,进程可通过该库使用D-Bus的能力。 总线层:总线层实际上是由D-Bus总线守护进程提供的。它在Linux系统启动时运行,负责进程间的消息路由和传递,其中包括Linux内核和Linux桌面环境的消息传递。 包装层:包装层一系列基于特定应用程序框架的Wrapper库。 D-Bus具备自身的协议,协议基于二进制数据设计,与数据结构和编码方式无关。该协议无需对数据进行序列化,保证了信息传递的高效性。无论是libdbus,还是D-Bus总线守护进程,均不需要太大的系统开销。 总线是D

DBus 入门与应用 -- DBus 的 C 编程接口

空扰寡人 提交于 2019-12-06 08:15:31
转载自:http://www.cnblogs.com/muxue/archive/2012/12/02/2798876.html 最近在学 Dbus,不过总是不得其门而入。 大部分资料都讲了很多东西却最终没有让我搞清楚怎么用 DBus,不就是一个 IPC 通信的工具么?就没有一点实用些的资料么?看了很多资料之后还是觉得只见树木不见森林。仔细整理下思路,觉得还是应该从最基本的方面入门,先从 DBus 的 C API 入手学习,有了这些知识,就算麻烦,也可以先在完成一个基本功能的例子程序的同时大概的知道 DBus 的运行机制。 在网上找到这么一篇文章: http://www.matthew.ath.cx/misc/dbus , 正合我意,下面的内容基本是对这篇文章的翻译和扩充。 注意: 翻译没有得到原文作者同意,原文也很简单易懂,最好去读原文。如果收到投诉,我会立即撤掉本文的。 本文不是一篇好的 DBus 入门,有很多基本的东西不在记述之内。 一般情况下不会直接使用 C API 进行 DBus 的编程,而是使用某种 DBus-binding,但我觉得理解 DBus 的 C API 对完整地理解 DBus 是非常重要的。 虽然 DBus 是用 C 写的,而且本文写的是 C API,但是 DBus 设计中充满的面向对象的思想,请注意。 一、共通部分的代码 在使用 DBus 进行通信的时候

dbus基本接口(转)

流过昼夜 提交于 2019-12-06 08:14:47
http://www.haohaoxuexi.com/Institute/Details.php?Id=9896 建立服务的流程: ---------------------------------- 建立一个dbus连接之后 -- dbus_bus_get(),为这个dbus连接(DbusConnection)起名 -- dbus_bus_request_name(),这个名字将会成为我们在后续进行远程调用的时候的服务名,然后我们进入监听循环 -- dbus_connection_read_write()。在循环中,我们从总线上取出消息 -- dbus_connection_pop_message(),并通过比对消息中的方法接口名和方法名 -- dbus_message_is_method_call(),如果一致,那么我们跳转到相应的处理中去。在相应的处理中,我们会从消息中取出远程调用的 参数。并且建立起回传结果的通路 -- reply_to_method_call()。回传动作本身等同于一次不需要等待结果的远程调用。 发送信号的流程: ---------------------------------- 建立一个dbus连接之后,为这个dbus连接起名,建立一个发送信号的通道,注意,在建立通道的函数中,需要我们填写该信号的接口名和信号名 -- dbus_message_new

D-BUS简单例子

本秂侑毒 提交于 2019-12-06 07:51:29
/* * Example low-level D-Bus code. * Written by Matthew Johnson <dbus@matthew.ath.cx> * * This code has been released into the Public Domain. * You may do whatever you like with it. */ #include <dbus/dbus.h> #include <stdbool.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> /** * Connect to the DBUS bus and send a broadcast signal */ void sendsignal(char* sigvalue) { DBusMessage* msg; DBusMessageIter args; DBusConnection* conn; DBusError err; int ret; dbus_uint32_t serial = 0; printf("Sending signal with value %s\n", sigvalue); // initialise the error value dbus_error_init(&err);

DBus 入门与应用 -- DBus 的 C 编程接口

十年热恋 提交于 2019-12-06 07:32:48
原文地址:http://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html 转载请注明出处。 作者: 唐风 最近在学 Dbus,不过总是不得其门而入。 大部分资料都讲了很多东西却最终没有让我搞清楚怎么用 DBus,不就是一个 IPC 通信的工具么?就没有一点实用些的资料么?看了很多资料之后还是觉得只见树木不见森林。仔细整理下思路,觉得还是应该从最基本的方面入门,先从 DBus 的 C API 入手学习,有了这些知识,就算麻烦,也可以先在完成一个基本功能的例子程序的同时大概的知道 DBus 的运行机制。 在网上找到这么一篇文章: http://www.matthew.ath.cx/misc/dbus , 正合我意,下面的内容基本是对这篇文章的翻译和扩充。 注意: 翻译没有得到原文作者同意,原文也很简单易懂,最好去读原文。如果收到投诉,我会立即撤掉本文的。 本文不是一篇好的 DBus 入门,有很多基本的东西不在记述之内。 一般情况下不会直接使用 C API 进行 DBus 的编程,而是使用某种 DBus-binding,但我觉得理解 DBus 的 C API 对完整地理解 DBus 是非常重要的。 虽然 DBus 是用 C 写的,而且本文写的是 C API,但是 DBus 设计中充满的面向对象的思想,请注意。 一