一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)); sigaction函数用于改变进程接收到特定信号后的行为.该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误).第二个参数是指向结构sigaction的一个实例的指针,在结…
信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用. sigqueue的第一个参数是指定接收信号的进程ID,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值. 一,sigaction() #inclu…
    对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个阶段: 信号诞生 信号在进程中注册 信号在进程中的注销 信号处理函数执行 1    信号诞生     信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障):软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作. 这里按发出信号的原因简单分类,以了解各种信号: (1) 与进程终止相关的信号.当…
一,什么是中断? 1.中断的基本概念 中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程.引起中断发生的事件被称为中断源.中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应. 在有些情况下,尽管产生了中断源和发出了中断请求,但CPU内部的处理器状态字PSW的中断允许位已被清除,从而不允许CPU…
1.kill函数 int kill(pid_t pid, int sig); 发送信号给指定的进程. (1) If pid is positive, then signal sig is sent to the process with the ID specified by pid. 如果pid是正数,则发送信号sig给进程号为pid的进程. (2) If pid equals 0, then sig is sent to every process in the process group…
与shell的kill命令类似,一个进程能够使用kill系统调用向另一进程发送信号. 之所以选择kill作为术语,因为早期UNIX实现中大多数信号的默认行为是终止进程. #include <signal.h> int kill(pid_t pid, int sig); pid参数标识一个或多个目标进程,而sig则指定了要发送的信号.如何解释pid,要视以下4中情况而定. 如果pid大于0,那么会发送信号给由pid指定的进程.如果pid等于0,那么会发送信号给与调用进程同组的每个进程,包括调用进…
一,信号安装 如果进程要处理某一信号,那么就要在进程中安装该信号.安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号:该信号被传递给进程时,将执行何种操作. linux主要有两个函数实现信号的安装:signal().sigaction().其中signal()只有两个参数,不支持信号传递信息,主要是用于前32种非实时信号的安装:而sigaction()是较新的函数(由两个系统调用实现:sys_signal以及sys_rt_sigaction),有三个参数,支…
今天继续对信号进行研究,话不多说,言归正传: 更多信号发送函数: 上节中我们已经接触到了一些信号的发送函数,这里更进一步学习一下其它的发送函数: alarm:只能发送SIGALRM信号 下面通过一个例子来介绍这个函数: #include <unistd.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/types.h> #include <fcntl.h> #include…
经过了漫长的间歇,对于c语言的学习也被中断了很久,现实确实有很多的无耐,计划中的事情总会被打乱,但不管怎样,学习的道路是不能休止的,所以经过了一断温习后现在继续学习C语言,话不多说,进入正题: 信号分类 可靠信号与不可靠信号 不可靠信号: linux信号机制基本上是从unix系统中继承过来的.早期unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 我们用上节课的例子来解释上面的这断话: 运行来看下: 而第二次再按ctrl+c,还是会输出我们的处理程序: 所以与之…
今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了,进入正题: 三种不同精度的睡眠: 关于这个函数,实际上已经在之前使用过了,具体可以参考博文:http://www.cnblogs.com/webor2006/p/3525517.html 查看man帮助:   以微秒为单位,那微秒跟秒是什么关系呢? 1秒=10的3次方毫秒=10的6次方微妙 以纳秒…
今天继续学习信号相关的知识,主要还是学习sigqueue另外信号发送函数,并配合上节学习的sigaction的用法,进入正题: sigqueue函数: sigval联合体: 实际上sigval参数是用来进程间通信用的,实际上信号是一个很古老的进程间通信的一种手段,通过这个参数,可以从一个进程发送到另外一个进程,并且可以附带参数.下面以实际代码来说明sigqueue是如何传递数据的: 这里需要编写一个进程发送信号和一个进程接收信号来说明sigqueue: 接收信号: 要想接收信号数据,则需要在si…
有时,进程需要向自身发送信号,raise 函数就执行了这一任务. #include <signal.h> int raise(int sig); 在单线程程序中,调用raise相当于对kill的如下调用: kill(getpid(), sig); 支持线程的系统会将raise(sig)实现为:pthread_kill(pthread_self(), sig) 后面会描述pthread_kill函数,但目前仅需要了解一点就已足够,该实现意味着将信号传递给调用raise的特定线程.相比之下,kil…
一,alarm() 在将可重入函数之前我们先来了解下alarm()函数使用: #include <unistd.h> unsigned int alarm(unsigned int seconds) 系统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号.如果指定的参数seconds为0,则不再发送 SIGALRM信号.后一次设定将取消前一次的设定.该调用返回值为上次定时调用到发送之间剩余的时间,或者因为没有前一次定时调用而返回0. 注意,在使用时,alar…
一,三种时间结构 time_t://seconds   struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };   struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; 二,setitimer() 现在的系统中很多程序不再使用alarm调用,而是使用setitimer调用来设置定时器,…
今天起,开始新的知识的学习,对于上个系列进程的学习还差一个理论上的总结,这个会下次补回来,以便通过实践之后,再用理论将其巩固一下,好了,话不多说,开始进入这个主题的学习----信号,很重要,但不是太容易理解,所以得一步一步来! 中断[纯概念,但是很重要]: 在学习信号之前,首先需要理解一下什么是中断,因为信号与中断有很多的相似之处,中断,顾名思义就是中途打断:   那什么是异步事件呢?它是没有一定时序关系,随机发生的事件,在中断技术出现之前,计算机对异步事件处理能力是有限的,通过是通过查询的方式…
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合,每个信号占用一位(64位).Linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用.下面是为信号集操作定义的相关函数: #include <signal.h> int sigemptyset(sigset_t *set): int sigfillset(sigs…
    一些IO系统调用执行时, 如 read 等待输入期间, 如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是让系统调用失败?早期UNIX系统的做法是, 中断系统调用, 并让系统调用失败, 比如read返回 -1, 同时设置 errno 为 EINTR中断了的系统调用是没有完成的调用, 它的失败是临时性的, 如果再次调用则可能成功, 这并不是真正的失败, 所以要对这种情况进行处理, 典型的方式为: ) {…
今天继续探讨信号相关的东东,话不多说,正入正题: 信号在内核中的表示: 下面用图来进一步描述这种信号从产生到递达之间的状态(信号阻塞与未诀):   那是怎么来决定的呢?下面慢慢来举例分解: 所以,通过这些图,可以描述信号从产生到递达的一个过程,上面的理解起来可能有点难,下面会用代码来进一步阐述,在进行实验之前,还需了解一些函数的使用,这些函数在实验中都会被用到,也就是信号集操作函数. 信号集操作函数: 其中解释一下sigset_t,百度百科解释为: 而这个函数的意义就是将这64位清0 这个函数的…
今天继续对信号进行学习,开始正入正题: sigaction函数: 安装信号之前我们已经学过一个函数:signal,它最早是在unix上出现的,它是对不可靠信号进行安装的,之后出现了可靠信号和实时信号,所以新的安装函数sigaction函数就出现了,它的原形如下:   sigaction结构体: 通过man手册来查看一下它的说明:       关于这些说明,下面会用实验一一来阐述的,所以可以先了解一下既可. sigaction示例: 下面先来看一下它的简单用法,也就是实现signal相同的功能来安…
信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达. 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了.信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息. 信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障):软件来源,最…
目录 1. 进程 1.1 概念 1.2 查看进程 1.3 启动新进程 1.3.1 system() 函数 1.3.2 fork() 函数 1.3.2 exce 系列函数 1.3.2.1 exce 系列函数说明 1.3 终止进程 1.4 等待进程 1.4.1 wait() 函数 1.4.2 waitpid() 函数 2. 管道 2.1 概念 2.2 匿名管道 2.2.1 匿名管道特征 2.2.2 pipe() 函数 2.3 命名管道 2.3.1 命名管道特征 2.3.2 创建命名管道命令 2.3.…
信号是软件中断,很多比较重要的应用程序都需要处理信号.并且信号提供了一种处理异步事件的方法.如终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序 很多条件都可以产生信号,比如用户键入某些终端键,CTRL+C或者delete,进程调用kill(2)函数可将任意信号发送给另一个进程或进程组, 硬件检测到异常产生的信号,软件某种条件导致的异常 使用kill -l就可以看有多少种信号类型 kill -L 1) SIGHUP  2) SIGINT  3) SIGQUIT  4) …
信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信号将作业控制命令传递给它的子进程.在linux系统中,定义了一系列的信号,这些信号可以由 内核产生,也可以有系统中的其他进程产生,只要这些进程的权限足够大.进程可以屏蔽掉大多数的信号,除了SIGSTOP和SIGKILL,前者使一个 正在运行的进程暂停,后者则使一个正在运行的进程退出.应用程序收到信号…
作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14673383.html 目录 系统编程 (一)进程 1.进程的概念 2.进程函数接口 (1)fork()在进程内部创建新的子进程 (2)getpid().getppid()查看自身PID号/查看父进程的PID号 (3)wait().waitpid()子进程中资源回收 (4)return 0.exit(0)进程的退出问题 (5)exec函数族(替换子进程) 3.进程的通信 (0)获取唯一的标识符key值ftok…
信号发送 kill 和 raise函数 kill函数参数详解: 实验1 raise和kill 的使用 #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> //定义信号处理函数 //signo: 进程捕获到的信号 void sig_handler(int signo){ printf("%d…
信号的概念 man 7 siganl  查看man手册 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪......他们都有共性:1. 简单 2. 不能携带大量信息 3. 满足某个特设条件才发送. 信号是信息的载体,Linux/UNIX 环境下,古老.经典的通信方式, 现下依然是主要的通信手段. Unix早期版本就提供了信号机制,但不可靠,信号可能丢失.Berkeley 和 AT&T都对信号模型做了更改,增加了可靠信号机制.但彼此不兼容.POSIX…
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) System V IPC:消息队列.信号量.共享内存 Socket(支持不同主机上的两个进程IPC) 我们在这一讲介绍Unix IPC,中有关信号(Signal)的处理. 信号(Signal) Signal :进程给操作系统或进程的某种信息,…
1.通过终端按键产生信号 通过上一篇我们知道了SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下. 首先解释什么是Core Dump.当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump.进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug.一个进程允许产生多大的co…
目录 信号的介绍 信号的机制 信号的编号 Linux常规信号一览表 信号的产生 终端按键产生信号 硬件异常产生信号 kill函数/命令产生信号 信号的操作函数 信号集设定 sigprocmask函数 sigpending函数 信号的捕捉 signal函数 sigaction函数 内核实现信号捕捉的过程 信号的传参 捕捉函数传参 信号的机制 ​ A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行.与硬件中断类似--异步模…
"===信号========================================================================================================================" 一.信号的概念: .本质: 软中端:信号通过内核发送,内核处理的. .特性: )简单,)不能携带大量信息: )满足某一条件 .信号机制: 软中端:信号通过内核发送,内核处理的:通过软件的方法实现的,有较强的延迟性. .四要素: .信号…