#include <signal.h>
typedef void (*sighandler_t) (int);
sighandler_t signal(int signum, sighandler_t handler);
#include <stdio.h>
#include <signal.h>
void handler_sigint(int signo)
{
printf("recv SIGINT\n");
}
int main()
{
signal(SIGINT, handler_sigint);
while(1)
;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
static void sig_handler_int(int sig)
{
printf ("int_ok\n");
}
static void sig_handler_tstop(int sig)
{
printf ("tstop_ok\n");
}
int main()
{
int j;
unsigned long addr;
printf ("sig_handler_int : 0x%u\n", (unsigned long)sig_handler_int);
printf ("sig_handler_tstop : 0x%u\n", (unsigned long)sig_handler_tstop);
addr = (unsigned long)signal(SIGINT, sig_handler_int);
printf ("0x%u\n", addr);
addr = (unsigned long)signal(SIGINT, sig_handler_tstop);
printf ("0x%u\n", addr);
return 0;
}
$ ./handler
sig_handler_int : 0x134513760
sig_handler_tstop : 0x134513780
0x0
0x134513760
typedef void Sigfunc (int);
Sigfunc * signal(int signo, Sigfunc *func)
{
struct sigaction act, oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask); //设置处理函数信号掩码,这里设置为空集,表示在该信号处理函数运行期间,不阻塞额外的信号
act.sa_flags = 0;
if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
#endif
} else {
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */
#endif
}
if (sigaction(signo, &act, &oact) < 0)
return(SIG_ERR);
return(oact.sa_handler);
}
#ifdef __USE_GNU typedef __sighandler_t sighandler_t; #endif |
/* Type of a signal handler. */ typedef void (*__sighandler_t) (int); |
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |