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语言程序设计有所帮助。