信号初步

信号是进程间通信方式的一种手段,采用异步通信机制,如果一个进程接收到一个信号,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 }

 

posted @ 2017-02-16 22:22  柳下_MBX  阅读(272)  评论(0编辑  收藏  举报