进程间的信号通信
2016-12-18 21:36
162 查看
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进程通信---信号
- posix进程间的通信 各信号意义
- 进程通信:信号通信之SIGSEGV测试
- 【UNIX】什么是进程间FIFO通信以及信号通信
- linux进程间的通信(C):信号
- linux进程间的通信机制——信号
- 【进程】进程通信-信号方式(中断)
- 进程通信之(一) 信号机制实验
- 进程通信之信号
- 进程通信之信号机制实验
- Linux c==进程通信--信号(5)
- Linux下信号通信实现A进程死循环输出A后被C进程处理输出C
- 进程通信之信号通信
- Linux-进程间的通信-信号集函数【转】
- Linux 进程通信之 ——信号和信号量总结
- linux 下进程间通过信号进行通信的具体实现过程
- linux进程的信号通信与进程的管道通信
- 进程通信--信号
- 进程通信之信号
- 进程通信之信号量