linux的基础知识——信号的四要素和kill

1.信号的四要素

\qquad 信号的名字;信号的编号;信号的默认处理动作;信号的事件

2.信号相关命令

\qquad 查看linux下的所有信号:kill -l;查看信号文档:man 7 signal。一共有64个信号。linux常规信号一览表

 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
3.信号的默认动作
动作意义
Term终止进程
lgn忽略信号
Core终止进程,生成core文件
Stop停止(暂停)进程
Cont继续运行进程

\qquad 对于信号的处理,有执行默认动作,忽略和捕捉,其中 9)SIGKILL和 19)SIGSTOP,不允许捕捉和忽略,只能执行默认动作。

4.信号的产生
4.1 终端按键产生信号
按键操作信号说明
ctrl + c2:SIGINT(终止/中断)INT:interrupt
ctrl + z20:SIGTSTP(暂停/停止)T:terminal STP:stop
ctrl + \3:SIGQUIT(退出)
4.2 硬件异常产生信号
异常操作信号
除0操作8:SIGFPE
非法访问内存11:SIGSEGV(段错误)
总线错误7:SIGBUS
4.3 kill函数或者kill命令产生信号
4.3.1 kill命令产生信号
kill -9 10624  // 给进程10624发送9)SIGKILL信号	
4.3.2 kill函数

\qquad int kill(pid_t pid,int sig)
\qquad 功能:给指定进程发送指定信号(不一定杀死)
\qquad 返回值:成功返回0;失败返回-1
\qquad 参数:第一个参数:pid>0,发送信号给指定进程;pid=0,发送信号给与调用kill函数进程属于同一进程组的所有进程;pid<0,取|pid|发送给对应进程组;pid=-1,发送给进程有权发送的系统中的所有进程。 第二个参数:sig不推荐使用数字,建议使用宏名
\qquad 举例:调用kill函数,自己把自己杀死

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>

int main()
{
        int ret = kill(getpid(),SIGKILL);
        if(ret==-1){
                perror("kill error!");
                exit(1);
        }
        return 0;
}
5.举例

\qquad 创建5个子进程,然后依次杀死

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<errno.h>
#include<stdlib.h>
#include <sys/types.h>
#include <signal.h>

int main()
{
        pid_t pid,q[5];
        int i;
        for(i=0;i<5;i++){
                pid = fork();
                if(pid==-1){
                        perror("fork error!");
                        exit(1);
                }
                else if(pid==0){
                        break;
                }
                q[i]=pid;
        }
        if(i<5){
                while(1){
                        printf("i am child %d,getpid()=%d\n",i,getpid());
                        sleep(1);
                }
        }
        else{
                for(i=0;i<5;i++){
                        sleep(2);
                        kill(q[i],SIGKILL);
                }
        }
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值