1.简单信号注册signal
int signal(int signum,(void*)&func)
需要注册的信号signum,信号注册的回调函数func
2.注册复杂的信号sigaction
int sigaction(int signum,const struct sigaction* gac,struct sigaction* oldgac)
其中struct sigaction
{
void (*sa_handler)(int);
void(*sa_sigaction)(int,siginfo_t*,void *);
sigset_t sa_mask;
int sa_flags;
}
例子1:
简单的信号注册
#include <stdio.h>
#include <signal.h>
void sigcatcher(int signum);
int main()
{
char buffer1[100],buffer2[100];
int i;
if(signal(SIGTERM,&sigcatcher)==-1)
{
printf("couldn't register signal handler!\n");
exit(1);
}
printf("pid of this process:%d \n",getpid());
printf("please putin:\n");
for(;;)
{
fgets(buffer1,sizeof(buffer1),stdin);
for(i=0; i<100; ++i)
{
if(buffer1[i]>=97 && buffer1[i] <=122)
buffer2[i]=buffer1[i]-32;
else
buffer2[i]=buffer1[i];
}
printf("your putin is %s\n",buffer2);
}
exit(0);
}
void sigcatcher(int signum)
{
printf("cat signal sigterm.\n");
exit(0);
}
2.注册多个信号事件的例子。
#include <stdio.h>
#include <signal.h>
void intfunc(int signum);
void exitfunc(int signum);
int main()
{
char buffer1[100],buffer2[100];
int i;
if(signal(SIGINT,&intfunc)==-1)
{
printf("can't register signal handler for sigint!\n");
exit(1);
}
if(signal(SIGTSTP,&exitfunc)==-1)
{
printf("can't register signal handler for sigtstp!\n");
exit(1);
}
if(signal(SIGTERM,&exitfunc)==-1)
{
printf("can't register signal handler for sigterm!\n");
exit(1);
}
printf("pid of this process :%d\n",getpid());
for(;;)
{
printf("please putin :\n");
fgets(buffer1,sizeof(buffer1),stdin);
for(i = 0; i < 100; ++i)
{
if(buffer1[i] >= 97 && buffer1[i] <= 122)
{
buffer2[i]=buffer1[i] - 32;
}
else
{
buffer2[i]=buffer1[i];
}
}
printf("your input is :%s \n",buffer2);
}
exit(0);
}
void intfunc(int signum)
{
printf("catch signal %d\n",signum);
}
void exitfunc(int signum)
{
printf("signal SIGTERM %d\n",signum);
exit(0);
}
3.高级信号注册
#include <stdio.h>
#include <signal.h>
#include <string.h>
void sighandler(int signum);
int main()
{
char buffer1[100],buffer2[100];
int i;
struct sigaction act;
act.sa_handler=sighandler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
if(sigaction(SIGTERM,&act,NULL)==-1)
{
printf("couldn't register signal handler!\n");
return 1;
}
printf("pid of this process :%d\n",getpid());
for(;;)
{
printf("please input:\n");
fgets(buffer1,sizeof(buffer1),stdin);
for(i=0; i< 100; ++i)
{
if(buffer1[i] >= 97 && buffer1[i] <= 122)
{
buffer2[i] = buffer1[i]-32;
}
else
{
buffer2[i] = buffer1[i];
}
}
printf("your input is:%s\n",buffer2);
}
exit(0);
}
void sighandler(int signum)
{
printf("catch signal SIGTERM.\n");
exit(0);
}