本章学习内容
1.信号的基本概念
2.常见信号名称、编号及功能说明
3.响应方式(signal)
4.发送信号(kill)
一、信号的基本概念
1.概念:
信号是系统响应某条件的事件,进程接到信号后会执行相应的操作。(一般来说,程序中出现错误才会向程序发送信号)
2.与信号相关的系统调用头文件为 signal.h
3.信号过程:
二、常见信号名称、编号及功能说明
信号名称 信号编号 说明
SIGHUP 1 连接挂断
SIGINT 2 终端中断 //键盘按下ctrl+c时,会产生该信号
SIGQUIT 3 终端退出
SIGILL 4 *非法指令
SIGTRAP 5
SIGABORT 6 *进程异常终止
SIGBUS 7
SIGFPE 8 *浮点运算异常
SIGKILL 9 终止进程(此信号不能被捕获或忽略) //该信号响应方式不允许改变
SIGUSRI 10 用户定义信号1
SIGSEGV 11 *无效内存段访问
SIGUSR2 12 用户定义信号2
SIGPIPE 13 向无读进程的管道写数据 //读端关闭的描述符,写端写入时产生,该信号会终止
SIGALRM 14 超时警告
SIGTERM 15 终止
SIGSTKFLT 16 //系统kill命令默认发送信号
SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
SIGCONT 18
SIGSTOP 19
SIGTSTP 20
SIGTTIN 21
SIGTTOU 22
SIGURG 23
三、响应方式(signal)
1.进程的响应方式
进程的响应方式分三类
(1)默认 (SIG_DFL)
(2)忽略(SIG_IGN)
(3)自定义
代码实现三种响应方式
(1)默认方式响应(SIG_DFL)
main函数如下
结果
结论:代码运行后,会以main函数定义方式间隔一秒向屏幕打印出“Hello”,在键盘输入ctrl (SIGINT 2 终端中断 //键盘按下ctrl+c时,会产生该信号),默认系统该响应方式,终止程序
(2)忽略响应方式(SIG_IGN)
运行结果
结论:通过运行结果我们可以看出,在输入ctrl c后程序不会被终止(这里我们最后是通过ctrl \终止的程序),证明系统忽略了SIGNIT(ctrl c)可以终断程序这个响应
(3)自定义响应方式 void fun(int sig)
变量的定义方式
typedef void ( * sighandle _t) ( int );
signandle _t signal ( int sig, sighandle _t sig _ fun);
main函数如下
main函数中我们自己定义的响应方式第一次输入ctrl c我们输出SIGINT的相应编号, 第二次输入ctrl c以默认方式终止程序
运行结果
总结:我们可以通过signal(响应1名称,自定义的响应方式),来改变响应1的响应方式
四、发送信号(kill)
kill()可以向指定的进程发送指定的信号:
int kill( pid _t pid, int sig);
pid>0指定将信号发送个那个进程
pid==0信号被发送到和当前进程在同一个进程组的进程
pid==-1将信号发送给系统上有权限发送的所有的进程
pid<-1将信号发送给进程组 id等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
main函数实现模拟向进程发送终止(kill)信号
signal.c函数为上述的自定义响应方式(第一次输入ctrl c我们输出SIGINT的相应编号, 第二次输入ctrl c以默认方式终止程序)
mykill.c函数如下
运行signal.c后程序会一直输出“Hello”,我们通过重新打开一个页面,通过管道获取signal程序的pid号,然后结合我们自己定义的信号mykill(参数为:1.要发送信号进程的pid号2.该程序要执行的响应方式)来终止signal.c程序的死循环(相当于通过mykill.c向signal.c发送信号)
补充内容:ps 查看当前进程
ps -ef显示系统所有进程
| 管道
| grep “进程名”管道精准查
ps -ef | grep “进程名” 精准查找并查看该进程