Linux信号概念
系统定义好的信号
常见的信号
产生信号的条件
信号产生

#include<unistd.h>#include <stdio.h>int main(void){while (1){sleep(1);printf("signal %d\n",getpid());}return 0;}


jobs显示当前暂停的迸程
bg n辻后台程序迄行(n是程序的名字)
fg n切换到前台返行
命令后面加&表示后台返行
kill -9 xxx(pid)杀死进程
发送信号的函数

#include <unistd.h>#include <stdio.h>#include <signal.h>#include <stdlib.h>int main(void){//荻取当前pidpid_t pid = getpid();printf("cur pid = %d\n",pid);//給pid发送一个挂起信号printf("kill send SIGTEST\n");kill(pid,SIGTSTP);//給当前迸程发送一个挂起信号printf("raise send SIGTEST\n");raise(SIGTSTP);//定肘一秒狆后給自己爰送SIGALARM信号,默人終止当前迸程printf("alarm send SIGALARM\n");alarm(1);for (int i= 0;;i++){printf("%d\n",i);sleep(0.1);}//終止当前迸程printf("run end \n");abort();return 0;}
信号捕捉
signal捕获信号
#include <unistd.h>#include <stdio.h>#include <signal.h>#include <stdlib.h>//信号赴理函数void alrmhandler(int sig){printf("产生一个信号\n");}int main(void){pid_t pid;//創建一个子迸程pid = fork();switch (pid){case 0: //子迸程赴理{//子迸程给父迸程发送一个闹钟信号sleep(5);kill(getppid(),SIGALRM);//getppid获取父进程exit(0);}break;case -1://失败处理{perror("fork error\n");exit(0);}break;default: //父迸程赴理{//注册一个閘狆信号処理函数signal(SIGALRM, alrmhandler);printf("父迸程等待一个信号\n");pause();}break;}printf("run end \n");return 0;}
signal信号恢复


#include <unistd.h>#include <stdio.h>#include <signal.h>#include <stdlib.h>void inthander(int sig){printf("SIGINT中断\n" ) ;//恢夐原始赴理,第二次中断肘程序退出signal(SIGINT,SIG_DFL);//忽略逑个信号signal(SIGINT,SIG_IGN);}int main(void){//注册信号赴理凾数signal(SIGINT,inthander);while(1){sleep(1);printf("signal %d\n",getpid());}return 0;}
sigaction捕获信号




#include <unistd.h>#include <stdio.h>#include <signal.h>#include <stdlib.h>//信号処理凾数void inthandler(int sig){printf("产生一个信号\n");}int main(void){//定乂一个信号劫作結杓体struct sigaction act = {};//没置信号外理函数act.sa_handler = inthandler;//没置信号祢志act.sa_flags = 0;//没置信号屏蔽集sigemptyset(&act.sa_mask);//注册信号sigaction(SIGINT,&act,0);while (1){printf("%d \n",getpid());sleep(1);}return 0;}


