Linux学习(8)-信号(shell) 常见信号、发送信号(kill)及信号相应方式(signal)

本章学习内容

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 “进程名”  精准查找并查看该进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值