捕获信号

pause函数挂起调用它的进程,直到有任何消息到达。
调用进程必须由能力处理送达的信号,不然信号的默认部署就会发生。。

#include <unistd.h>编程

int pause(void);数组

只有进程捕获到一个信号的时候pause才返回,若是递送到的信号引起了对信号的处理,那么处理工做将在pause返回前执行。
pause老是返回-1,而且变量errno设置为EINTR。
 
 
发送信号和捕获信号是相辅相成的。
每一个进程可以决定响应除了SIGSTOP和SIGKILL以外的其余全部信号
SIGSTOP和SIGKILL不能被捕获或者忽略。
捕获信号不是真的去捕获它,而是等待信号被发送过来。
 
 
当执行一个程序的时候,全部信号的状态都是系统默认或者忽略。
当一个进程调用fork的时候,其子进程继承父进程的信号处理方式,因此信号捕捉函数的地址在子进程中是有意义的。
 
 
 
定义信号处理器。
某些状况下,一个信号的默认动做就是所但愿的行为。但更多场合下,你能够改变默认行为或者执行额外的代码。
若是想改变默认行为就必须定义并安装一个自动以的信号处理器。
 
 
 
指向函数的指针
  –能够用指针变量指向整形变量、字符串、数组、结构体、也能够指向一个函数。
  –一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。
  –能够用一个指针变量指向函数,而后经过该指针变量调用此函数
 
 
 
函数指针例子
int func(int i1,int i2)
{
    return i1 + i2;
}

int main()
{
    int (*pfunc)(int, int) ;
    pfunc = func;
    printf("%d\n", pfunc(3, 5));
    return 0;
}
回调函数
  –回调函数就是一个经过函数指针调用的函数。
  –若是把函数的指针(地址)做为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,咱们就说这是回调函数。
  –回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
  –Windows编程下的窗口过程就是典型的回调函数。
 
 
 
signal函数
  –UNIX/Linux处理信号最经常使用的接口是signal函数
•在命令行使用kill命令,向指定进程发送信号。
  –使用kill函数

#include <signal.h>函数

void (*signal(int signo, void (*func)(int))) (int);spa

参数signo是前面表格中的信号名。
参数func是接到此信号后要调用的函数。该函数有个int型参数,int表明捕获到的信号值
 
 
 
进程捕捉到信号并对信号进行处理时,进程正在执行的指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。
若是信号处理程序返回(没有调用exit(0)或者abort),则继续执行在捕捉到信号时进程正在执行的正常指令序列。
在信号处理程序中,不能判断捕捉到信号时进程正在何处执行。
 
 
signal函数例子
 
void catch_Signal(int Sign)
{
    switch(Sign)
    {
    case SIGINT:
        printf("SIGINT Signal\n");
    }
}
int main(int arg, char *args[])
{
    signal(SIGINT, catch_Signal);
    pause();
    return 0;
}

 

编译后执行该程序
用kill命令发送信号给该程序
  –kill命令做用其实不是‘杀死’的意思,而是将指定信号发送给指定进程。
 
 
 
 
 
 
 
 
 
相关文章
相关标签/搜索