signal信号

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函数处继续执行下去,创建出的子进程也继续在该出进行

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

nginx master工作循环

微笑、不失礼 提交于 2019-12-24 06:49:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 默认情况下,nginx使用的是master-worker工作模式接收命令行指令和处理客户端请求。在nginx启动master进程后,其会进行整个nginx工作环境的初始化,然后会依次启动worker进程、cache manager和cache loader进程,接着会进入一个工作循环中,以等待命令行发送来的指令,从而实现对nginx的管理工作。本文主要讲解nginx是如何进行信号的初始化和处理的。 1. 信号处理方法 在介绍nginx是如何组织信号之前,我们首先需要理解的是对信号进行管理的几个主要的方法: 方法 参数 作用 sigaction(int signo, conststruct *act, struct sigaction * oldact); signo指定了当前需要监听的信号类型;act指定了处理当前信号的方法;oldact将接收原先设置的处理信号的方法; 对于signo指定的信号,为其设置接收到该信号时的处理方法 sigemptyset(sigset_t *set) set中存储了当前进程正在监听的信号集 将指定信号集中的信号清空 sigaddset(sigset_t *set, int signo) set为目标信号集;signo为将要添加的信号 将指定信号添加到目标信号集中

19 Signals and Signal Handling

佐手、 提交于 2019-12-23 00:16:39
1 What are signals and how are they used 1.当进程接收到信号,进程会暂停,来处理信号 1.1 How we use signals 1. killall cat 杀死所有的cat程序 2.信号源与信号 信号源 信号 kill SIGTERM Ctrl-c SIGINT Ctrl-z SIGTSTP fg SIGCONT 2 The Wide World of Signals Signal Value Action Comment SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGILL 4 Core Illegal Instruction SIGABRT 6 Core Abort signal from abort(3) SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference SIGPIPE 13 Term

QT信号槽机制

痞子三分冷 提交于 2019-12-20 18:04:43
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制。在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应。例如: 一开始我们的Find按钮是未激活的,用户输入要查找的内容后,查找按钮就被激活,这就是输入框与Find按钮这两个组件间通信的例子。 早期,对象间的通信采用回调来实现。回调实际上是利用函数指针来实现,当我们希望某件事发生时处理函数能够获得通知,就需要将回调函数的指针传递给处理函数,这样处理函数就会在合适的时候调用回调函数。回调有两个明显的缺点: 它们不是类型安全的,我们无法保证处理函数传递给回调函数的参数都是正确的。 回调函数和处理函数紧密耦合,源于处理函数必须知道哪一个函数被回调。 信号与槽 在QT中,我们有回调技术之外的选择,也即是信号槽机制。所谓的信号与槽,其实都是函数。当特定事件被触发时(如在输入框输入了字符)将发送一个信号,而与该信号建立的连接槽,则可以接收到该信号并做出反应(激活Find按钮)。 QT组件预定义了很多信号和槽,而在GUI编程中,我们习惯于继承那些组件,继承后添加我们自己的槽,以便以我们的方式来处理信号。槽和普通的C++成员函数几乎是一样的,它可以是虚函数,可以被重载,可以是共有、私有或是保护的,也同样可以被其他成员函数调用。它的函数参数也可以是任意类型的。唯一不同的是:槽还可以和信号连接在一起。 与回调不同

022 UNIX再学习 -- 信号处理

纵饮孤独 提交于 2019-12-19 02:15:07
一、闹钟和睡眠 1、函数 alarm # include <unistd.h> unsigned int alarm ( unsigned int seconds) ; 返回值:返回 0 或先前所设闹钟的剩余秒数 (1)函数功能 使用 alarm 函数可以设置一个定时器 (闹钟时间) ,在将来的某个时刻该定时器会超时。当定时器超时时,产生 SIGALRM 信号 。如果忽略或不捕捉此信号,则其默认动作是终止调用该 alarm 函数的进程。 (2)参数解析 参数 seconds 的值是产生信号 SIGALRM 需要经过的时钟秒数。 当这个时刻到达时,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一个时间间隔。 (3)函数解析 每个进程只能有一个闹钟时间。 如果在调用 alarm 时,之前已为该进程注册的闹钟时间还没有超时,则该闹钟时间的余值作为本次 alarm 函数调用的值返回。以前注册的闹钟时间则被新值代替。 如果有以前注册的尚未超过的闹钟时间,而且 本次调用的 seconds 值是 0,则取消以前的闹钟时间 ,其余留值仍作为 alarm 函数的返回值。 虽然 SIGALRM 的默认动作是终止进程,但是大多数使用闹钟的进程捕捉此信号。 如果此时进程要终止,则在终止之前它可以执行所需的清理操作。如果我们想捕捉 SIGALRM 信号,则必须在调用 alarm

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