signal

Java应用实现优雅关闭

自作多情 提交于 2020-01-15 07:12:21
1.实现SignalHandler 在进程被kill时收到TERM信号,对main函数的运行不会有任何影响 public class GracefulShutdownHandler implements SignalHandler { public void registerSignal(String signalName) { Signal signal = new Signal(signalName); Signal.handle(signal, this); } @Override public void handle(Signal signal) { switch (signal.getName()) { case "TERM": // break; case "INT": // break; default: } } } 2.ShutdownHook 在进程被kill的时候main函数就已经结束,仅会运行shutdownHook中run()方法的代码。 Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { // } }); 3.SpringBoot优雅关闭 实现TomcatConnectorCustomizer接口,用于注入tomcat的connector

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

linux下c++进程相关

不打扰是莪最后的温柔 提交于 2020-01-01 00:27:13
1.首先是获取当前程序的pid和ppid(parent pid) #include<stdio.h> #include<unistd.h> int main() { printf("the pid of this program is %d\n",(int)getpid()); printf("the parent pid is %d\n",(int)getppid()); return 0; } 执行过程中发现,多次执行后pid一般会变化,而ppid一般不会变, 2.在程序中创建新进程可以有两种方式,一种是直接通过system函数,该函数相当于创建一个子进程,并将函数内的参数传递给该子进程,等同于在命令行下执行该命令,若该shell无法执行,则返回值为127,其他错误则返回值-1,执行正确返回值0; #include<stdlib.h> #include<stdio.h> int main() { int returnValue = system("ls -l"); printf("%d\n",returnValue); return 0; } system函数执行的结果被返回到终端中输出 还有一种方法就是通过fork()/exec()创建新进程,fork()函数创建一个父进程的拷贝给子进程,并在调用fork函数处继续执行下去,创建出的子进程也继续在该出进行

线程同步,条件变量pthread_cond_wait

混江龙づ霸主 提交于 2020-01-01 00:24:11
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。条件变量使我们可以睡眠等待某种条件出现。 条件变量是利用线程间共享的全局变量进行同步的一种机制, 主要包括两个动作: 一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。 条件的检测是在互斥锁的保护下进行的。如果条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。 pthread_cond_wait 原子调用: 等待条件变量, 解除锁, 然后阻塞 当 pthread_cond_wait 返回,则条件变量有信号,同时上锁 等待条件有两种方式: 条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(), 其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT 无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait() (或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。 mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP), 且在调用pthread_cond_wait()前必须由本线程加锁

深入理解pthread_cond_wait、pthread_cond_signal

陌路散爱 提交于 2020-01-01 00:23:10
转自:http://blog.csdn.net/yeyuangen/article/details/37593533 ===============================man pthread_cond_wait的解释========================== LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数。但这个函数的执行过程比较难于理解。 pthread_cond_wait()的工作流程如下(以MAN中的EXAMPLE为例): Consider two shared variables x and y, protected by the mutex mut, and a condition vari- able cond that is to be signaled whenever x becomes greater than y. int x,y; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; Waiting until x is greater than y is performed as follows: pthread_mutex

信号量与条件变量的区别

。_饼干妹妹 提交于 2020-01-01 00:22:59
注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注 进程间通信 ; 而条件变量、互斥锁,主要关注 线程间通信 。 下面内容参考: http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait指的是 条件变量 ,总和一个 互斥锁结合使用 。在 调用pthread_cond_wait前要先获取锁 。pthread_cond_wait函数执行时先 自动释放 指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量 重新锁住 。 int pthread_cond_signal(pthread_cond_t * cond); pthread_cond_signal通过条件变量 cond发送消息 ,若多个消息在等待,它 只唤醒一个 。 pthread_cond_broadcast可以唤醒所有。调用pthread_cond_signal后要 立刻释放互斥锁 ,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞

Linux 进程间通信系列之 信号

雨燕双飞 提交于 2020-01-01 00:22:04
信号(Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号 语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又 能够统一对外接口,用sigaction函数重新实现了signal函数) 信号种类 每种信号类型都有对应的信号处理程序(也叫信号的操作),就好像每个中断都有一个中断服务例程一样。大多数信号的默认操作是结束接收信号的进程;然而,一个进程通常可以请求系统采取某些代替的操作,各种代替操作是: 忽略信号。随着这一选项的设置,进程将忽略信号的出现。有两个信号 不可以被忽略:SIGKILL,它将结束进程;SIGSTOP,它是作业控制机制的一部分,将挂起作业的执行。 恢复信号的默认操作。 执行一个预先安排的信号处理函数。进程可以登记特殊的信号处理函数。当进程收到信号时,信号处理函数将像中断服务例程一样被调用,当从该信号处理函数返回时,控制被返回给主程序,并且继续正常执行。 但是,信号和中断有所不同。中断的响应和处理都发生在内核空间,而信号的响应发生在内核空间,信号处理程序的执行却发生在用户空间。 那么,什么时候检测和响应信号呢?通常发生在两种情况下: 当前进程由于系统调用

进程间的通信—信号

限于喜欢 提交于 2020-01-01 00:21:37
一、信号及信号源 1、信号本质   信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。   信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。 2、信号来源   信号事件的发生有两个来源: 硬件来源(比如我们按下了键盘或者其它硬件故障); 软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。 二、进程对信号的响应   进程可以通过三种方式来响应一个信号: 忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP; 捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数; 执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。   Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。 三、信号的安装   如果进程要处理某一信号,那么就要在进程中安装该信号

信号

断了今生、忘了曾经 提交于 2019-12-30 13:54:57
文章目录 一、信号及其处理过程 1、概述 1.1、发送信号 1.2、待处理信号集合 1.3、接收信号与阻塞信号 1.4 信号处理函数的终止 2、发送信号 2.1、kill函数 2.1.1、其中pid的值: 2.1.2、信号发送的权限: 2.1.3、错误返回的errno标志 2.1.4、Linux权限管理(拓展) 2.2、发送信号的其他方式 2.2.1、raise函数(向自身发送信号) 2.2.2、killpg函数 3、信号集、待处理信号、阻塞信号 3.1、信号集处理: 3.2、处于等待状态的信号 3.3、阻塞信号传递(信号掩码) 3.3.1、概述 3.3.2、sigprocmask函数 4、改变信号处理 4.1、信号的默认行为 4.2、signal()函数 4.2.1、可移植性说明 4.3、sigaction()函数 4.3.1、与signal函数的比较 4.3.2、sa_flag信号说明 4.3.2.1、signal函数实现——使用sa_flag的实例 4.3.2.2、abort函数实现——使用sa_flag的实例 4.3.2.2.1、abort函数的功能 4.3.2.2.2、abort函数的实现 4.3.2.3、sigaltstack函数——实现SA_ONSTACK的基础 5、常用信号及其说明 5.1 SIGKILL(终止进程)和SIGSTOP(停止进程) 5.1.1

Linux进程信号详解

↘锁芯ラ 提交于 2019-12-28 06:16:10
信号是什么 一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件 信号是多种多样的,并且一个信号对应一个事件,这样才能做到收到一个信号后,知道到底是一个什么事件,应该如何处理(但是要保证必须识别这个信号) 信号的种类 使用 kill-l 命令查看信号种类 一共62种,其中1 31是非可靠信号,34 64是可靠信号(非可靠信号是早期Unix系统中的信号,后来又添加了可靠信号方便用户自定义信号,这二者之间具体的区别在下文中会提到) 信号的生命周期 产生》》进程中的注册》》进程中的注销》》捕获处理 信号的产生 硬件事件举例: 如果一个进程试图除以0,那么内核就发送给它一个SIGFPE信号(序号8) 如果一个进程执行一条非法指令,那么内核就发送给它一个SIGILL信号(序号4) 如果进程进行非法存储器引用(野指针、段错误),内核就发送给它一个SIGSEGV信号(序号11) 软件事件举例: ctrl+c 中断信号——20) SIGTSTP ctrl+| 退出信号——3) SIGQUIT ctrl+z 停止信号——2) SIGINT kill命令: kill -signum pid 当kill命令不带 -signum 参数时( kill pid ),默认的信号是15) SIGTERM 而 kill -9 pid 则是一个强大的“强杀”命令,能杀死 kill pid