优秀文章学习连接https://www.jianshu.com/p/f445bfeea40a
#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 signum %d\n",signum);
printf("never quit\n");
}
int main()
{
signal(SIGINT,handler);
while(1);
return 0;
}
~
~
~
~
按 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 signum %d\n",signum);
switch(signum){
case2:printf("SIGINT\n");
break;
case9:printf("SIGKILL\n");
break;
case10:printf("SIGUSR1\n");
break;
}
printf("never quit");
}
int main()
{
signal(SIGINT,handler);
signal(SIGKILL,handler);
signal(SIGUSR1,handler);
while(1);
return 0;
}
~
~
~
~
发送信号传给pro 执行kill指令
#include<signal.h>
#include<stdio.h>
#include <sys/types.h>
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
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);
kill(pid, signum);
sprintf(cmd,"kill -%d %d", signum,pid);
system(cmd);
printf("send signal ok");
return 0;
}
~
~
~
信号如何携带信息编程样例
1.创建信号和信号中存放信息的结构体
#include <signal.h>
#include<stdio.h>
// int sigaction(int signum, const struct sigaction *act,
// struct sigaction *oldact);
void handler(int signum, siginfo_t *info, void *context)
{
printf("ready handler\n");
printf("get signum:%d \n",signum);
if(context != NULL){
printf("get data =%d",info->si_int);
printf("get data =%d",info->si_value.sival_int);
}
}
int main()
{
struct sigaction act;
printf("create struct signal\n");
printf("pid = %d\n",getpid());
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO; //get message
printf("start action\n");
sigaction(SIGUSR1,&act,NULL);
printf("action over\n");
while(1);
return 0;
}
~
~
~
"NiceSignal.c" 42L
2.向信号中发送信息
#include <signal.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int signum;
int pid;
printf("send ok2\n");
signum = atoi(argv[1]);
pid = atoi(argv[2]);
printf("send ok1\n");
union sigval value;
value.sival_int = 100;
printf("%d,done",getpid());
printf("send ok\n");
sigqueue(pid, signum,value);
printf("send ok3\n");
return 0;
}
在这里插入图片描述