1、Kill:调用kill函数终止进程
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signum);
功能:给指定的进程发送编号为signum的信号。
返回值:成功返回0,失败返回-1.
>> pid的取值有4种情况:
1)pid>0:将信号传送给进程ID为pid的进程。(单个进程)
2)pid=0:将信号传送给当前进程所在进程组中的所有进程。
3)pid=-1:将信号传送给系统内的所有进程。
4)pid<-1:将信号传给指定进程组的所有进程,这个进程组号等于pid的绝对值。
2、Alarm
#include<unistd.h>
unsigned int alarm(unsigned int seconds); //类似定时自杀,定时器。只是设置,并不会阻塞。
功能:在seconds秒之后,向调用进程发送一个SIGALRM信号,SIGALRM信号的默认动作是终止调用alarm函数的进程。
返回值:若以前没有设置过定时器,或设置的定时器已超时,返回0.否则返回定时器剩余的秒数,并重新设置定时器。
3、Raise
#include<signal.h>
int raise(int signum);
功能:给当前进程/调用raise的进程本身送一个信号。
参数:signum是信号的编号
返回值:成功返回0,失败返回-1.
用kill函数也可以实现此功能,kill加上自己的pid。Kill不仅可以给自己发信号,还可以给别人发信号。
4、Abort:是一个库函数
#include<stdlib.h>
void abort(void);
功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。
注意:即使SIGABRT信号被加入阻塞集,一旦进程调用了abort函数,进程也还是会终止,且在终止前会刷新缓冲区,关文件描述符。
5、Pause
#include<unistd.h>
int pause(void);
功能:将调用进程挂起(阻塞)直至捕捉到信号为止。这个函数通常用于判断信号是否已到。
返回值:直到捕获到信号,pause函数才返回-1,且errno被设置成EINTR。
一个进程收到一个信号的时候,可以用如下方法进行处理:
1>执行系统默认动作:对大多数信号来说,系统默认动作是用来终止该进程。
2>忽略此信号:接收到此信号后没有任何动作。
3> 执行自定义信号处理函数:使用用户自己定义的信号处理函数处理该信号。程序中可用函数signal()改变信号的处理方式。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int sign)
{
if(sign == SIGINT)//Ctrl + C
printf("rev SIGINT\n");
if(sign == SIGQUIT)//Ctrl + \ //
printf("rev SIGQUIT\n");
}
int main(int argc,char * argv[])
{
printf("wait for SIGINT or SIGQUIT.\n");
signal(SIGINT,signal_handler);
signal(SIGQUIT,signal_handler);
pause();
pause();
return 0;
}
运行结果如下:
按ctrl+c,打印SIGINT。
按ctrl+\ , 打印SIGQUIT。