#include
void (*signal(int sig, void (*func)(int)))(int); //func 返回值是void ,包含一个参数 int
#include
#include
#include
#include
void test1(int signo)
{
printf("SIGINT\n") ;
}
void test2(int signo)
{
printf("SIGQUIT\n") ;
}
int main(void)
{
signal(SIGINT,test1) ; //SIGINT就是ctrl+C
signal(SIGQUIT,test2); //SIGQUIT就是ctrl+\
while(1)
;
return 0;
}
#include
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
#include
#include
#include
#include
jmp_buf env ;
void fun1(int signo)
{
printf("SIGRTMIN + 15\n");
longjmp(env,10);
}
void fun2(int signo)
{
printf("SIGTRMAX - 9 \n");
longjmp(env,20);
}
int main(void)
{
switch(setjmp(env))
{
case 0: break;
case 10:printf("fun1 \n"); break;
case 20:printf("fun2 \n");break ;
}
signal(SIGRTMIN+ 15,fun1);
signal(SIGRTMAX -9,fun2);
while(1)
;
return 0;
}
int sigsetjmp(sigjmp_buf env, int savesigs); //savesigs 非0,就会在env,保存进程的当前信号屏蔽字,从而解决上面提到的问题
void siglongjmp(sigjmp_buf env, int val);
#include
#include
#include
#include
#include
int flag = 0;
jmp_buf env ;
void fun1(int signo)
{
if(flag == 0)
return ;
printf("SIGRTMAX - 9 \n");
sleep(1);
printf("after sleep !! \n");
sleep(20);
siglongjmp(env ,100); //信号不会丢失
}
int main(void)
{
switch(sigsetjmp(env,10000)) //第二个参数只要非零即可
{
case 0:flag= 1 ;break;
case 100:printf("fun1 !!! \n");break;
}
signal(SIGRTMAX- 9 ,fun1);
while(1)
;
return 0;
}
#include
int kill(pid_t pid, int sig);
参数pid 有几种情况:
1、pid>0 将信号传给进程号为pid 的进程.
2、pid=0 将信号传给和目前进程相同进程组的所有进程
3、pid=-1 将信号广播传送给系统内所有的进程(除1号进程和自身)
4、pid<0 将信号传给进程组号为-pid 的所有进程
#include
#include
#include
#include
#include
int main(int argc ,char **argv) //kill -s 2 **** // kill **** 只支持这两种形式的命令!!!!
{
int i ,j ;
pid_t pid ;
char str[520]; //保存命令行输入
int signum = SIGTERM ; //默认为正常退出
if(argc < 2 || argc > 4 )
{
printf("Wrong commend !! \n");
exit(-1);
}
if(argc == 2)
pid = atoi(argv[1]) ;
if(argc == 4)
{
signum = atoi(argv[2]) ; // -s 为指定发送的信号,2 为Ctrl+C信号
pid = atoi(argv[3]) ;
}
if(kill(pid,signum) < 0)
{
printf("Kill error !!! \n");
exit(-1);
}
}
#include
unsigned alarm(unsigned seconds);
#include
#include
#include
#include
#include
void fun(int signo)
{
printf("liushengxi zui shuai !!! \n");
alarm(1) ; //一秒发一个SIGALRM 信号
}
int main(void)
{
signal(SIGALRM,fun);
raise(SIGALRM); //先触发一个SIGALRM 信号
while(1)
;
return 0;
}
#include
void abort(void);
int sigemptyset(sigset_t *set); 将set集合置空
int sigfillset(sigset_t *set); 将所有信号加入set集合
int sigaddset(sigset_t *set,int signo); 将signo信号加入到set集合
int sigdelset(sigset_t *set,int signo); 从set集合中移除signo信号
int sigismember(const sigset_t *set,int signo); signo判断信号是否存在于set集合中
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);
如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。如果set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。
参数how的取值不同,带来的操作行为也不同,该参数可选值如下:
1.SIG_BLOCK: 该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
2.SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。
注意事项:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化。
http://blog.csdn.net/elbort/article/details/7594772