signal(参数1,参数2);

参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(64)。其实这些信号时系统定义的宏。

参数2:我们处理的方式(是系统默认还是忽略还是捕获)。

一般有3中方式进行操作。

1eg: signal(SIGINT ,SIG_ING );

//SIG_ING 代表忽略SIGINT信号SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。

2eg: signal(SIGINT ,SIG_DFL );

//SIGINT信号代表由InterruptKey产生,通常是CTRL +C或者是DELETE。发送给所有ForeGroundGroup的进程。  SIG_DFL代表执行系统默认操作,其实对于大多数信号的系统默认动作时终止该进程。

(3)void ( *signal( int sig, void (* handler)( int )))( int ) 自定义处理函数

例如:自定义一个处理函数,找出31个普通信号中不能捕捉到的信号

wKiom1eXVk_h3N7uAABXsrB3wFg669.png-wh_50

wKioL1eXVk-iYXbLAAA8aYrpf9E906.png-wh_50

pause函数

#include <unistd.h>
int pause(void);
pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR, 所以pause只有出错的返回值。

用pause函数实现一个sleep函数:


wKioL1eXWCTBg4O9AABsj79EzJc587.png-wh_50

wKiom1eXWCWDULBhAAANjQp5fdY945.png-wh_50

可重入函数

可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。

可重入函数使用的变量有两种情况:

1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;

2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。

void strcpy (*dest,*src)
     while (* dest++ = *src ++){;}
     *dest = NUL;

分析:上面的函数用于字符串复制,而参数是存放在堆栈中的,故而改函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。

 

基本上下面的函数都是不可重入的:

    1.函数内使用了静态的数据。

    2.函数内使用了malloc()或者free()函数的。

    3.函数内调用了标准的I/O函数的。

int temp;
  void swap( int *ex1, int *ex2)
     temp = *ex1; //(1)
     *ex1 = *ex2;
     *ex2 = temp;

分析:该函数中的全局变量temp是的函数变成了一个不可重入的函数,因为在多任务系统中,假如在任务1中调用swap函数,而程序执行到(1)处时被中断,进而执行其它的任务2,而刚好任务2也调用了swap函数,则temp里存的值则会被任务2改变。从而回到任务1被中断处继续执行的时候,temp里存的值已经不再是原来存的temp值了,进而产生了错误。

 

常用的可重入函数的方法有:

1.不要使用全局变量,防止别的代码覆盖这些变量的值。

2.调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。

3.使用信号量(互斥条件)。