linux下基于C语言的信号编程实例
本文实例讲述了linux下基于C语言的信号编程方法。分享给大家供大家参考。具体如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
voidsig_handler(intsig_no,siginfo_t*info,void*ctext){
printf("receivesig_no=%d\n",sig_no);
if(sig_no==SIGQUIT){
printf("haha,想退出了吗?");
}else{
printf("si_signo=%d\n",info->si_signo);
printf("si_code=%d\n",info->si_code);
printf("si_pid=%d\n",info->si_pid);
printf("si_uid=%d\n",info->si_uid);
printf("si_status=%d\n",info->si_status);
printf("si_utime=%lld\n",info->si_utime);
printf("si_stime=%lld\n",info->si_stime);
printf("si_value=%d\n",info->si_value);
printf("si_addr=0x%x\n",info->si_addr);
printf("si_fd=%d\n",info->si_fd);
}
return;
}
/*--------------------常用信号列表----------------------------*/
//SIGINTctrl+c
//SIGQUITctrl+\
//SIGPIPE管道破裂
//SIGKILL进程终止,不能被捕获
//SIGHUPshell退出
//SIGCHLD子进程终止信号
//SIGFPE浮点数异常(除以0之类的)
//SIGTERM终止信号(killpid)
intmain(intargc,char**argv){
structsigactionsa;
sa.sa_flags=0;
sa.sa_sigaction=sig_handler;
sa.sa_flags|=SA_SIGINFO;//使用sa_sigaction作为回调
//sa.sa_flags|=SA_RESETHAND;//处理函数只会被调用一次,之后被重置
//sa.sa_flags|=SA_NOCLDSTOP;//如果安装了SIGCLD,子进程不是正常退出,而是被kill掉了,则不会通知
//sa.sa_flags|=SA_NODEFER;//使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号
//sa.sa_flags|=SA_RESTART;//使被信号打断的系统调用自动重新发起
//sa.sa_flags|=SA_NOCLDWAIT;//使父进程在它的子进程退出时不会收到SIGCHLD信号,这时子进程如果退出也不会成为僵尸进程
//安装信号
if(sigaction(SIGINT,&sa,NULL)==-1)printf("安装信号失败\n");
if(sigaction(SIGQUIT,&sa,NULL)==-1)printf("安装信号失败\n");
while(1){
sleep(1);
}
return0;
}
/*--------------------------信号编程相关结构体----------------------------------*/
//structsigaction{
//void(*sa_handler)(int);
//void(*sa_sigaction)(int,siginfo_t*,void*);
//sigset_tsa_mask;
//intsa_flags;
//void(*sa_restorer)(void);
//}
//siginfo_t{
//intsi_signo;/*Signalnumber*/
//intsi_errno;/*Anerrnovalue*/
//intsi_code;/*Signalcode*/
//pid_tsi_pid;/*SendingprocessID*/
//uid_tsi_uid;/*RealuserIDofsendingprocess*/
//intsi_status;/*Exitvalueorsignal*/
//clock_tsi_utime;//Usertimeconsumed
//clock_tsi_stime;/*Systemtimeconsumed*/
//sigval_tsi_value;/*Signalvalue*/
//intsi_int;/*POSIX.1bsignal*/
//void*si_ptr;/*POSIX.1bsignal*/
//void*si_addr;/*Memorylocationwhichcausedfault*/
//intsi_band;/*Bandevent*/
//intsi_fd;/*Filedescriptor*/
//}
//信号值动作解释
//SIGHUP1终端线路挂断
//SIGINT2Term键盘输入的中断命令,从终端输入Ctrl-C时发生
//SIGQUIT3Core键盘输入的退出命令
//SIGILL4Core错误指令
//SIGABRT6Coreabort(3)发出的中止信号
//SIGFPE8Core浮点数异常
//SIGKILL9TermKILL信号
//SIGSEGV11Core非法内存访问
//SIGPIPE13Term管道断开
//SIGALRM14Termalarm(2)发出的中止信号
//SIGTERM15Term强制中止信号
//SIGUSR130,10,16Term用户自定义信号1
//SIGUSR231,12,17Term用户自定义信号2
//SIGCHLD20,17,18Ign子进程中止信号
//SIGCONT19,18,25Cont继续执行一个停止的进程
//SIGSTOP17,19,23Stop非终端来的停止信号
//SIGTSTP18,20,24Stop终端来的停止信号
//SIGTTIN21,21,26Stop后台进程读终端
//SIGTTOU22,22,27Stop后台进程写终端
希望本文所述对大家的C语言程序设计有所帮助。
