进程间的信号通信
2017-01-21 00:17
239 查看
1.信号通信:
信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
(1)当用户按某些按键时,产生信号。
(2)硬件异常产生信号:除数为0,无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产
生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。
(3)进程用kill函数将信号发送给另一个进程。
(4)用户可用kill命令将信号发送给其他进程。
2.信号类型:
下面是几种常见的信号:
(1)SIGHUP: 从终端上发出的结束信号。
(2)SIGINT: 来自键盘的中断信号(Ctrl-C)。
(3)SIGKILL:该信号结束接收信号的进程,杀死进程。
(4)SIGTERM:kill 命令发出的信号。
(5)SIGCHLD:子进程停止或结束时通知父进程。
(6)SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号,暂停进程。
3.信号处理:
当某信号出现时,将按照下列三种方式中的一种进行处理:
(1)忽略此信号:大多数信号都按照这种方式进行处理,但有两种信号决不能被忽略,它们是:SIGKILL\SIGSTOP。
这两种信号不能被忽略的原因是:
它们向超级用户提供了一种终止或停止进程的方法。
(2)执行用户希望的动作:
通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理。
(3)执行系统默认动作:
对大多数信号的系统默认动作是终止该进程。
4.几个有关信号处理的函数:
(1)kill
函数功能:发送信号给指定的进程
函数的原型: int kill(pid_t pid, int sig);
函数的参数:传送指给定的sig信号给参数pid;
pid > 0: 进程号为pid的进程;
pid = 0; 把信号传给和目前进程同进程组的所有进程;
pid = -1, 把信号给系统内所有的进程;
pid <0 ; 传给进程组号为pid绝对值的所有进程;
返回值: 成功为0,出错-1;
头文件: #include <sys/types.h>
#include <signal.h>
(2) raise
函数的作用:向进程自身发送一个信号;
函数的原型: int raise(int sig);
返回值:成功是0,出错-1;
头文件:#include <signal.h>
(3)alarm
函数的作用:设置闹钟信号,scod时间后SOGALRM信号传送给目前的进程;
函数的原型: unsigned int alarm(unsigned int sceconds);
返回值: 返回之前闹钟的剩余秒数, 未设闹钟返回0;
(4) pause
函数的作用: 市当前进程挂起,直至捕获到一个信号;
函数的原型:int pause(void)
头文件: #include <unistd.h>
(5)signal
函数的作用: 设置信号处理方式
函数的原型:void ( * signal (int signum, void ( *handler ) (int) ) )(int)
这样看函数很难理解,我们可以对其进行下面的操作,就容易理解
typedef void (*handler) (int) ) sighandler_t
signal (int signum, sighandler_t handler);
函数说明:signal()会依参数signum指定的信号编号来设置该信号的处理函数,当指定信号到达时就会跳转到参数
handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常量之一:
SIG_IGN:忽略参数signum指定的信号。
SIG_DFL:将参数signum指定的信号重设为核心预设的信号处理方式。
返回值:返回先前的信号处理函数,如果出错则返回-1。
信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
(1)当用户按某些按键时,产生信号。
(2)硬件异常产生信号:除数为0,无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产
生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。
(3)进程用kill函数将信号发送给另一个进程。
(4)用户可用kill命令将信号发送给其他进程。
2.信号类型:
下面是几种常见的信号:
(1)SIGHUP: 从终端上发出的结束信号。
(2)SIGINT: 来自键盘的中断信号(Ctrl-C)。
(3)SIGKILL:该信号结束接收信号的进程,杀死进程。
(4)SIGTERM:kill 命令发出的信号。
(5)SIGCHLD:子进程停止或结束时通知父进程。
(6)SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号,暂停进程。
3.信号处理:
当某信号出现时,将按照下列三种方式中的一种进行处理:
(1)忽略此信号:大多数信号都按照这种方式进行处理,但有两种信号决不能被忽略,它们是:SIGKILL\SIGSTOP。
这两种信号不能被忽略的原因是:
它们向超级用户提供了一种终止或停止进程的方法。
(2)执行用户希望的动作:
通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理。
(3)执行系统默认动作:
对大多数信号的系统默认动作是终止该进程。
4.几个有关信号处理的函数:
(1)kill
函数功能:发送信号给指定的进程
函数的原型: int kill(pid_t pid, int sig);
函数的参数:传送指给定的sig信号给参数pid;
pid > 0: 进程号为pid的进程;
pid = 0; 把信号传给和目前进程同进程组的所有进程;
pid = -1, 把信号给系统内所有的进程;
pid <0 ; 传给进程组号为pid绝对值的所有进程;
返回值: 成功为0,出错-1;
头文件: #include <sys/types.h>
#include <signal.h>
(2) raise
函数的作用:向进程自身发送一个信号;
函数的原型: int raise(int sig);
返回值:成功是0,出错-1;
头文件:#include <signal.h>
(3)alarm
函数的作用:设置闹钟信号,scod时间后SOGALRM信号传送给目前的进程;
函数的原型: unsigned int alarm(unsigned int sceconds);
返回值: 返回之前闹钟的剩余秒数, 未设闹钟返回0;
(4) pause
函数的作用: 市当前进程挂起,直至捕获到一个信号;
函数的原型:int pause(void)
头文件: #include <unistd.h>
(5)signal
函数的作用: 设置信号处理方式
函数的原型:void ( * signal (int signum, void ( *handler ) (int) ) )(int)
这样看函数很难理解,我们可以对其进行下面的操作,就容易理解
typedef void (*handler) (int) ) sighandler_t
signal (int signum, sighandler_t handler);
函数说明:signal()会依参数signum指定的信号编号来设置该信号的处理函数,当指定信号到达时就会跳转到参数
handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常量之一:
SIG_IGN:忽略参数signum指定的信号。
SIG_DFL:将参数signum指定的信号重设为核心预设的信号处理方式。
返回值:返回先前的信号处理函数,如果出错则返回-1。
相关文章推荐
- linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)
- Linux进程间信号通信
- Unix高级编程:线程的同步之信号量、进程通信之信号量集、system函数、简单web服务器代码
- linux进程通信之信号
- Linux 进程通信之 ——信号和信号量总结
- 进程通信-信号通信
- 进程通信之(一) 信号机制实验
- 信号---用于Linux 进程通信
- linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)
- Linux进程通信之信号
- 信号 进程通信
- 使用信号实现进程间的通信
- 进程通信之信号的运用
- Linux进程通信之信号
- Linux 进程通信之 ——信号和信号量总结
- 进程通信之信号篇 signal
- Linux 进程通信之 ——信号和信号量总结
- 进程通信:信号通信之SIGSTOP和SIGCONT测试
- 进程间的信号通信
- Linux C 进程间的信号通信