函数原型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void (* signal(int sig, void (*func)(int)); )(int);
typedef void (*sig_t) (int);
signal(int sig, sig_t func);
int kill(pid_t pid, int sig);
|
kill函数接受两个参数,第一个参数是pid,第二个参数是信号值。
如果pid是正的,信号会被发送到pid标识的进程
如果pid等于0,信号会被发送到调用进程所在进程组的每个进程
如果pid等于-1,信号会被发送到调用进程有权限发送到的所有进程,除了init进程
如果pid小于-1, 信号会被发送进程组的每一个id为-pid的进程
signal函数允许捕获一个信号、忽略信号,以及产生一个中断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <stdio.h> #include <sys/time.h> #include <signal.h> #include <stdlib.h> #include <unistd.h>
void alarmHandle(void); void exitHandle(void);
int main() { struct itimerval timer; long n_sec, n_usec; timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 300 * 1000; timer.it_value.tv_sec = 2; timer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &timer, NULL); signal(SIGALRM,(sig_t)&alarmHandle); signal(SIGINT, (sig_t)&exitHandle); while(1);
return 0; }
void alarmHandle() { static int callTimes = 0; callTimes++; if (callTimes > 20) { pid_t pid = getpid(); kill(pid, SIGINT); } printf("[%s]-(%s:%d) - alarm (%d)!\n", __FILE__, __FUNCTION__, __LINE__, callTimes); }
void exitHandle() { printf("exit!\n"); exit(0); }
|
注册一个时钟信号的处理函数,以及来自来自键盘中断的处理函数