4-5 Linux 中断进程 --- kill (kill -2 实验)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4-5 Linux 中断进程 --- kill (kill -2 实验)相关的知识,希望对你有一定的参考价值。

参考技术A 1、信号:传递给 Liunx 的事件发生通知机制。

2、kill -l:显示所有信号。一共有62个信号(没有32、33)。

3、常用的信号有:

kill -2 PID —— 正常中断进程(Ctrl + C 一样)。程序在结束之前,能够保存相关数据,然后再退出。

kill -9 PID —— 强制杀死一个进程。

kill -15 PID —— 正常方式终止一个程序。中断进程时应首先用 -15,以便于其能够预先清理临时文件和释放资源。-9 作为最后手段,应对那些失控的进程。

--------------------------------------------------------------------------------

1)、kill -2 中断后台运行的进程。

红色下划线:sleep 10000 & —— 后台运行延时 10000 秒的命令,进程 ID 为1516。

ps -j —— 以作业格式列出进程信息,可以看到 1516 sleep 命令的进程。

(PID:进程 ID、PGID:线程组 ID、SID:会话 ID、TTY:进程运行的终端,标识那个终端控制。(pts远程终端、tty系统终端)、TIME:进程运行的时间 和 CMD:命令的名称和参数)。

jobs -l —— 列出后台运行的命令,可以看到 1516 sleep 命令正在后台运行。

黄色下划线:kill -2 1516 —— 中断1516 进程。执行成功后,按 Enter 回车系统会给出提示Interrupt 提示(中断进程)。

蓝色方框:ps -j 已查询不到 1516 sleep 的进程。jobs -l 也没有后台运行的命令。

2)、kill -2 配合 fg 查看中断挂起的进程。

红色下划线:前台执行 sleep 10000 (延时10000秒)后 ctrl + z 挂起。

黄色下划线:ps -j 查看进程,可以看到 1344 sleep 进程。jobs -l 查看后台进程 1344 的状态是stopped 暂停状态。

蓝色下划线:kill -2 1344 中断 1344 进程。

绿色下划线:ps -j 查看进程,仍有 1344 sleep 进程。jobs -l 查看后台进程 1344 的状态是stopped 暂停状态。

暂时这样看,好像 kill -2 并没有起到中断进程的作用。

然而,用 fg 把后台的命令调至前台运行时可以发现 1344 sleep 已经被中断。

红色下划线:fg 把已经执行了 kill -2, 状态为 stopped 的1344 sleep命令调至前台执行。系统也反馈已经调至前台执行。(此时,实际上已经执行了 kill -2 中断了进程)

黄色方框:ps -j 已经没有了 1344 sleep 的进程。

蓝色方框:jobs -l 后台也没有指令。

3)、kill -2 配合 bg 查看中断挂起的进程。

通过上面的思路,kill -2 配合 bg 实验看看效果。同样的首先挂起一个命令,状态为 stopped 暂停。然后用 bg 命令恢复执行。

前面的步骤都是一样,挂起一个命令。通过 ps 和 jobs 查看进程和后台确认有 1379 的进程,状态为 stopped 暂停。然后执行 kill-2 中断进程,再次通过ps 和 jobs 查看进程和后台命令。确认状态为 stopped  1379 的进程仍然存在。

此时,用 bg 恢复运行挂起的命令,系统提示 sleep 命令已恢复在后台运行。然而通过 ps -j 查看进程会发现 sleep 已经被中断。jobs -l 查看后台也没有了运行的 sleep 命令了。

从实验上看:

1、后台命令运行时(Running),执行 kill -2 可以中断进程。

2、挂起命令,处于暂停状态时(Stopped),执行 kill -2 后通过 ps 还可以查询到进程, jobs还可以查询到后台命令,状态仍然是 Stopped 暂停状态。实际上,用 fg 把暂停的后台进程调至前台运行时,系统反馈 sleep 命令调至前台运行。而再用 ps 查询不到进程,已经中断了进程。用 jobs 已经查询不到后台命令。

3、挂起命令,处于暂停状态时(Stopped),执行 kill -2 后通过 ps 还可以查询到进程, jobs还可以查询到后台命令,状态仍然是 Stopped 暂停状态。用 bg 把暂停的后台命令恢复运行时,系统反馈 sleep 命令在后台运行。再用 ps 查询进程已经中断,用 jobs 已经查询不到后台命令。

Linux 进程间通信 --信号

  一、 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

二、信号的种类
    信号的名称是在头文件signal.h中定义的,信号都以SIG开头
    命令行输入  kill -l 即可查看所有的信号
    技术分享

三、进程对信号的响应

  进程可以通过三种方式来响应一个信号:

(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;

(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;

(3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。

  Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

四、信号的发送

  发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

  kill (int pid ,int signl) 既可以向自身发送信号,也可以向别的进程发送信号

  raise(int signl)  只能向进程本身发送信号。

  alarm()  在指定的时间之后发送给自己 一个 SIGALRM的信号,如果不捕捉此信号,默认是终止该进程。

      unsigned int alarm(unsigned int seconds); // 在多少秒之后

  pause()   使进程挂起直至捕捉到一个信号。

 五、信号的处理

  sighandler_t signal(int signum, sighandler_t handler);   

signal(SIGINT, my_func);

  第一个参数指定信号的值,

  第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIG_IGN)可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)my_func()。

  如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回SIG_ERR。

 

  

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

void my_func(int sign_no)
{
    if(sign_no==SIGINT)
        printf("I have get SIGINT\\n");
    else if(sign_no==SIGQUIT)
        printf("I have get SIGQUIT\\n");
}
int main()
{
    printf("Waiting for signal SIGINT or SIGQUIT \\n ");
    
    /*注册信号处理函数*/
    signal(SIGINT, my_func);
    signal(SIGQUIT, my_func);
    
    pause();
    exit(0);
}

 

 

以上是关于4-5 Linux 中断进程 --- kill (kill -2 实验)的主要内容,如果未能解决你的问题,请参考以下文章

linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法

Linux进程调度的kill命令

Linux基础21 进程介绍, 进程监控状态ps, 进程相关命令pstree,pgrep,pidof, 动态进程监控top, 进程中断概念, kill停止进程信号介绍pkill, killall

linux kill命令

linux中如何重启某一进程

linux-进程管理,ps,pstree,nice,top,vmstat,kill,jobs