signal
理论
函数原型:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-
signum
参数:传入的信号类型 -
handler
参数:处理信号的函数,函数接受一个整型参数,用于表示信号;函数的返回值是void类型。在函数内部编写处理信号的方法。
示例
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sig_handler(int signo) {
if (signo == SIGINT) {
puts("received SIGINT");
}
}
int main() {
if (signal(SIGINT, sig_handler) == SIG_ERR) {
puts("can not catch SIGINT");
}
while (1) {
sleep(1);
}
return 0;
}
#include <signal.h>
#include<stdio.h>
#include <unistd.h>
void handler();
int main()
{
int i;
signal(SIGALRM,handler);
alarm(5);
for(i=1;i<8;i++){
printf("sleep is -----%d\n",i);
sleep(1);
}
return 0;
}
void handler()
{
printf("hello\n");
}
同一种信号多次发生,通常并不讲它们排队,所以如果在某种信号被阻塞时它发生了五次,那么对这种信号解除阻塞后,其信号处理函数通常只会被调用一次。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void sig_int(int);
int main(void)
{
if(signal(SIGINT,sig_int) == SIG_ERR)
perror("can't catch SIGINT\n");
for(;;)
pause;
}
void sig_int(int signo)
{
printf("received SIGINT\n");
sleep(10);
printf("after sleep 10s\n");
}