int main(){
char *ptr=null;
memcpy(ptr,“nihao”,6)
return 0}
运行结果为 segmentation fault(core dumped)
为段错误,内存访问错误
gdb ./neicuncuowu
(gdb) r
Program received signal SIGSEGV,(程序接受到了一个信号) Segmentation fault.(内存段错误)
0x00007ffff7b64c95 in __memcpy_ssse3_back () from /lib64/libc.so.6
基本认识:
通知时间的发生–软中断–通知事件中断
信号有不同的种类:每个信号都对应了不同的事件
信号的生命周期:产生–>处理
kill -l查看当前系统所有信号62种信号(1-31)每个都有各自对应的事件(非可靠信号/非实时信号)
非可靠信号可能会丢失(肚子饿了发很多信号但是只吃了一次),值处理了一次其他信号丢失
(34-64)后继加的(可靠信号/实时信号)
可靠信号(发送几次信号就吃几次饭),法几次信号处理多少次
实时/非实时:是否会立即处理
- SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- SIGRTMAX-1 64) SIGRTMAX
信号的生命周期:产生–>注册–>注销–>处理 阻塞
信号的产生:
ctrl +c ctrl +| crtl +z
$ ./eg
nihaoshijie–
nihaoshijie–
^C
硬件按下contl+c是硬件cpu捕捉到一个硬件电信号操纵系统把硬件产生的电信号解释成一个软件信号2号信号(终断)SIGINT发给前台进程(运行在终端上的进程./eg)
contl+|退出信号3号信号(SIGQUIT)
contrl+z停止信号********
kill +pid 默认杀死的信号是SIGTERM终止
kill -9 就是强杀信号(SIGKILL)
软件: kill命令产生一个信号 kill -signo pid 命令 kill() raise() abort() alarm() 程序异常
vim /usr/include/bits/signum.h
看信号的作用
/* Signals. /
32 #define SIGHUP 1 / Hangup (POSIX). /
33 #define SIGINT 2 / Interrupt (ANSI). /
34 #define SIGQUIT 3 / Quit (POSIX). /
35 #define SIGILL 4 / Illegal instruction (ANSI). */
int main(){
4 //int kill(pid_t pid,int sig);
5 //给指定进程发送指定信号
E> 6 kill(getpid(),11);//kill(getpid(),SIFSEGV)
7 //发送11号信号
8 while(1){
9 printf(“nihaoa —\n”);
10 sleep(1);
11 }
12 return 0;
}
运行结果:
./loop
段错误(吐核)
给进程发送一个11号信号
//int raise(int sig);//给自己(调用进程/线程)发送一个信号不用指定ID
10 raise(SIGQUIT);//3号信号
11 while(1){
12 printf(“nihaoa —\n”);
13 sleep(1);
14 }
[chenyongjie@localhost signal]$ ./loop
退出(吐核)
// void abort(void),给一个进程发送一个SIGABRT信号给调用进程发
13 abort();
14 while(1){
15 printf(“nihaoa —\n”);
16 sleep(1);
17 }
18 return 0;
头文件为stdlib
./loop
已放弃(吐核)
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
15 // seconds秒之后给调用进程发送SIGALRM信号,seconds为0取消定时器
16 // 返回值值返回上一个定时器剩余的时间或者为0(之前没有定时器为0)
int ret= alarm(3);
18 while(1){
19 printf(“nihaoa —[%d]\n”,ret);
20 sleep(1);
21 }
22 return 0;
l]$ ./loop
nihaoa —[0]
nihaoa —[0]
nihaoa —[0]
闹钟
三秒钟后收到定时器信号结束
int ret= alarm(3);
18 sleep(1);
19 ret=alarm(0);
20 while(1){
21 printf(“nihaoa —[%d]\n”,ret);
22 sleep(1);
23 }
24 return 0;
等于0则取消定时器
[chenyongjie@localhost signal]$ ./loop
nihaoa —[2]
睡了1秒剩余2秒,所以上一个定时器还剩下两秒时间才到
core dumped–核心转储文件–程序异常退出时候保存程序的运行信息–方便事后调试
core dumped --默认关闭–占磁盘资源,安全性考虑
如何设置