Linux笔记_进程通讯——信号通讯

来源:互联网 发布:mac无法删除文件 编辑:程序博客网 时间:2024/05/22 06:25
******************************************************************
信号通讯

1.信号机制
信号机制是Unix系统中最为古老的进程间通信机制。很多条件可以产生一个信号:
1)当用户按某些按键时产生信号;
2)硬件异常产生信号:除数为零,无效的存储访问等等。通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程。
3)进程用kill函数将信号发送给另一个进程;
4)用户可用kil命令将信号发送给其它进程
 
2 信号类型
SIGHUP:从终端发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl+C)
SIGKILL:该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号

3 信号发送
发送信号的主要函数有kill和raise
区别:
kill既可以向自身发送信号,也可以向其它进程发送信号。与kill函数不同的是,raise函数是向进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)
kill的pid参数有四种不同的情况:

1)pid>0 将信号发给进程的ID为pid的进程;
2)pid==0 将信号发送给同组的进程;
3)pid<0将信号发送给其它进程组ID等于pid绝对值的进程;
4)pid==-1将信号发送给所有进程

Alarm函数
使用alarm函数可以设置一个时间值(闹钟时间)当所设置的时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。每个进程只有一个闹钟时间。
#include <inistd.h>
unsigned int alarm(unsigned int seconds)  seconds:经过了指定的second秒后会产生信号SIGALRM。

pause函数:
使调用进程挂起直至捕捉到一个信号
#include <unistd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。

4.  信号处理
有以下处理方式
1)忽略此信号:有两种信号不能忽略:SIGKILL和SIGTOP 因为他们向超级用户提供了已知终止或停止进程的方法
2)执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数,在用户函数中,执行用户希望的处理。
3)执行系统默认动作
对大多数信号的系统默认动作是终止该进程

信号处理的主要方法有两种,一种是使用简单的signal函数,另一种是使用信号集函数组。

指定信号处理的调用函数:
signal函数:
#include <signal.h>
void(*signal(int signo,void(*func)(int)))(int)  //函数:参数:1.int类型,2.函数指针;返回类型:函数指针
可以表示为:(看起来比较清晰)
typedef void(*sighandler_t)(int)
sighandler_t signall(int signum,sighandler_t handler)
Func 可能的值是:
1)SIG_IGN: 忽略此信号
2)SIG_DFL:按系统默认方式处理
3)信号处理函数名:使用该函数处理
演示:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void my_func(int sign_no)
{
     if(sign_no==SIGINT)
          printf("I have get SIGINT\n");
     else if(sign_no==SIGQUIT)
          printf("I have get SIGQUIT\n");
}
int main()
{
     printf("Waiting for signal SIGINT or SIGQUIT \n ");
    
     /*注册信号处理函数*/
     signal(SIGINT, my_func);
     signal(SIGQUIT, my_func);
    
     pause();
     exit(0);
}

******************************************************************8
0 0
原创粉丝点击