信号处理函数api:
入门:signal函数
高级:sigaction函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
信号发送函数api:
入门:kill
高级:sigqueue
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
代码演示:实现信号ctrl+c,关闭不了进程
#include <signal.h>
#include <stdio.h>
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
void handler(int signum)
{
printf("get signal=%d\n",signum);
switch(signum){
case 2:
printf("SIGINT\n");
break;
case 9:
printf("SIGKILL");
break;
}
}
int main()
{
signal(SIGINT,handler);
signal(SIGKILL,handler);
while(1);
return 0;
}
运行结果:
^Cget signal=2
SIGINT
^Cget signal=2
SIGINT
^Cget signal=2
SIGINT
Terminated
ctrl+c无法关闭可以实现,用kill -9 PID绕不过杀死进程,该进程还是被强制退出
代码实现发信号:方法一:
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc,char **argv)
{
int signum;
int pid;
signum=atoi(argv[1]);
pid=atoi(argv[2]);
//int kill(pid_t pid, int sig);
kill(pid,signum);
printf("send signal ok");
return 0;
}
此处signum与pid位置与上方的kill的api相反,根据实际需求写
./a.out 9 pid号
方法二:
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc,char **argv)
{
int signum;
int pid;
char cmd[128]={0};
signum=atoi(argv[1]);
pid=atoi(argv[2]);
printf("num=%d,pid=%d\n",signum,pid);
//int kill(pid_t pid, int sig);
//kill(pid,signum);
sprintf(cmd,"kill -%d -%d",signum,pid);
system(cmd);
printf("send signal ok");
return 0;
}