信号初步
信号是进程间通信方式的一种手段,采用异步通信机制,如果一个进程接收到一个信号,os会中断正在进行的程序流程,任何非原子操作都会被打断,如果进程定义了信号处理函数,那么会执行处理函数,否则执行默认的函数
kill命令:
1 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 2 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 3 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 4 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 5 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 6 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 7 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 8 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 9 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 10 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 11 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 12 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 13 63) SIGRTMAX-1 64) SIGRTMAX
后32个为实时信号,前32个标准信号,后32个多用于驱动开发
man 7 signal可以查看man中的详细信息
上面的第一列是宏定义:
第二列是对应编号,
第三写是默认的处理动作
第四列是注释
信号有重要的一个概念的三大行为和五大动作,上面就出现了5大动作:
term终止当前的进行
core核心已转储,默认结束当前进程并调用dump core使用gdb进行调式
cont:继续执行停止的进程
stop停止当前的进程
ign忽略当前的信号
如何向进程发送信号呢:
1:ctrl+c sigint
ctrl+z sigstop
ctrl+\ sigquit
2:kill命令
3:kill函数
int kill(int pid,int sig)
pid的编号类型决定kill的对象,类似于waitpid
sig表示信号类型
pid>0 指定id的进程
pid=0 与发送进程同组的进程
pid=-1 组id为pid得所有进程
pid<-1 发送给发送进程有权向该系统所有有权限发送信号的所有进程
4:某种软件条件到了:alarm定时器到了
unsigned int alarm(unsigned int seconds)
1 /* kill函数的使用 */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <signal.h> 6 #include <sys/types.h> 7 8 int main(int argc, char *argv[]) 9 { 10 if(argc < 3) 11 { 12 printf("./app signal pid\n"); 13 exit(-1); 14 } 15 16 if(kill((pid_t)atoi(argv[2]),atoi(argv[1])) < 0) 17 { 18 perror("kill"); 19 exit(1); 20 } 21 22 return 0; 23 } 24 25 26 27 /* alarm的使用 */ 28 #include <unistd.h> 29 #include <stdio.h> 30 int main(void) 31 { 32 int counter; 33 alarm(1); 34 for(counter=0; 1; counter++) 35 printf("counter=%d ", counter); 36 return 0; 37 }