对linux的kill命令不太了解的一些朋友一直会有这样一个错觉: kill命令就是用来杀死一个进程啊!   我要说, 这种理解是比较初级的。  其实, kill这个命令的命名本来就误导了一大批人, 我不知道是谁取了kill这个名字, 我要是知道, 首先要为大家打他的屁股。

kill命令的真正作用是:将某信号发送给某进程或者进程组。

下面, 我们先来看程序:

#include <stdio.h>
#include <signal.h>void sig_callback1()
{printf("signal: SIGUSR1\n");
}void sig_callback2()
{printf("signal: SIGUSR2\n");
}int main()
{  // 用户定义信号if(SIG_ERR == signal(SIGUSR1, sig_callback1)){printf("error1\n");return 1;}// 用户定义信号if(SIG_ERR == signal(SIGUSR2, sig_callback2)){printf("error2\n");return 1;}while(1){NULL;   }return 0;
}

执行结果为:

[taoge@localhost learn_c]$ kill -SIGUSR1 4652
[taoge@localhost learn_c]$ signal: SIGUSR1

[taoge@localhost learn_c]$ kill -SIGUSR2 4652
[taoge@localhost learn_c]$ signal: SIGUSR2

[taoge@localhost learn_c]$ kill 4652
[taoge@localhost learn_c]$ kill -SIGUSR1 4652
bash: kill: (4652) - No such process
[1]+  Terminated              ./a.out
[taoge@localhost learn_c]$

我们看到, kill命名实际上是向进程发送信号的。 那个kill 4652也是向进程发送信号, 发送的是SIGTERM信号, SIGTERM信号的默认操作是杀死进程, 哦, 原来是这么个逻辑。

好, 我们改一下上面的程序, 在感知到SIGTERM信号后, 不执行默认的杀死进程的操作, 如下:

#include <stdio.h>
#include <signal.h>void sig_callback1()
{printf("signal: SIGUSR1\n");
}void sig_callback2()
{printf("signal: SIGUSR2\n");
}void sig_haha()
{printf("heng, i do not terminate the process, so what?\n");
}int main()
{  // 用户定义信号if(SIG_ERR == signal(SIGUSR1, sig_callback1)){printf("error1\n");return 1;}// 用户定义信号if(SIG_ERR == signal(SIGUSR2, sig_callback2)){printf("error2\n");return 1;}// SIGTERM信号的默认操作是杀死进程, 但程序员完全可以改变这个默认操作, 说白了, 就是改变信号到函数的映射关系if(SIG_ERR == signal(SIGTERM, sig_haha)){printf("error3\n");return 1;}while(1){NULL;   }return 0;
}

执行结果为:

[taoge@localhost learn_c]$ ./a.out 
^C
[taoge@localhost learn_c]$ ^C
[taoge@localhost learn_c]$ ./a.out &
[1] 4787
[taoge@localhost learn_c]$ kill -SIGUSR1 4787
[taoge@localhost learn_c]$ signal: SIGUSR1

[taoge@localhost learn_c]$ kill -SIGUSR2 4787
[taoge@localhost learn_c]$ signal: SIGUSR2

[taoge@localhost learn_c]$ kill 4787
[taoge@localhost learn_c]$ heng, i do not terminate the process, so what?

[taoge@localhost learn_c]$ kill -SIGUSR1 4787
[taoge@localhost learn_c]$ signal: SIGUSR1

[taoge@localhost learn_c]$ kill -SIGUSR2 4787
[taoge@localhost learn_c]$ signal: SIGUSR2

可以看到, 执行kill 4787, ./a.out对应的进程并没有被杀死, 为啥呢? 因为我覆盖了系统默认的杀死操作, 看看signal(SIGTERM, sig_haha)你就明白了。 我重写了信号到函数的映射, 让SIGTERM映射为我自己写的sig_haha函数。

后来, 我又想了一下, 为什么要将kill命令命名为kill? 其实, 也许是有一点道理的, 对于小白来说, kill 4787的默认操作就是杀死这个进程。 好吧, 在不需要深入理解细节的时候, 把kill叫kill(杀死), 其实也无伤大雅。比如,对一些非程序猿来说(比如运维人员等), 不需要知道kill是发送什么鸟信号, 只要知道kill 4787是杀死4787这个进程即可。

算了, 打屁股的事情就此作罢

谁再把kill命令说成“杀死“就应该打屁股了相关推荐

  1. Mysql:kill命令之mysql杀死指定的进程(批操作)

    SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE db='op_system_gyj';

  2. linux用kill命令删除进程,linux 使用kill命令杀死进程的几个办法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal smx ...

  3. android 命令kill进程号,一定是我打开的姿势不对——Android下使用kill命令杀死指定进程...

    环境:Android 5.1.1(已root) 最近有一个需求,需要在Android下杀死指定pid的进程.Android原生API提供了几个接口: (1)android.os.Process.kil ...

  4. linux下kill命令小结

    1.作用  kill命令用来中止一个进程. 2.格式  kill [ -s signal | -p ] [ -a ] pid ...  kill -l [ signal ] 3.参数  -s:指定发送 ...

  5. nginx中用到的kill命令

    1.kill命令 1.1.kill命令简介 我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止:如果是后台进程,那么需要使用kill命令来终止.(其实C ...

  6. linux kill一个进程,linux kill命令:(中止一个进程)

    1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid - kill -l [ signal ] 3.参数 -s:指定发送的信号. - ...

  7. Linux kill命令原理及源码实现

    在 Linux 环境上工作时,你可能会看到应用程序或命令行进程卡住. 那么在这些情况下,终止它是唯一的出路. Linux 中的 kill 命令(位于 /bin/kill),是一个内置命令,用于手动终止 ...

  8. Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)

    这篇文章主要介绍了Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)的相关资料,需要的朋友可以参考下 在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映.这个时候, ...

  9. Linux 系统中kill命令杀死进程常用技巧

    前言 在Linux的系统中,kill是我们最常见的命令之一. kill,英语中为杀死的意思,顾名思义,就是用来杀死一些东西的命令,在linux中就是用来杀死系统中的进程. 在Windows系统中,如果 ...

最新文章

  1. HTTP API响应数据规范整理
  2. @总结 - 4@ 多项式的多点求值与快速插值
  3. Vue + Element UI——对话框式登录框DEMO
  4. android toolchain maintain team
  5. 纪中B组模拟赛总结(2020.2.7)
  6. hdu2066一个人的旅行(多源点多汇点的最短路径问题)
  7. cdc工具 postgresql_SQLServer CDC数据通过Kafka connect实时同步至分析型数据库 AnalyticDB For PostgreSQL及OSS-阿里云开发者社区...
  8. oracle11g安装副武器类,oracle 11g 服务器类
  9. Java 删除文件夹以及文件夹下的文件
  10. 【人生苦短,我学 Python】基础篇——字典(Day10)
  11. 图片在相应页面变化的时候拉长
  12. Obi - Advanced Rope Simulation 绳索插件学习文档
  13. RHEL 7.8 64bit MYSQL linux-generic 8.0.20 初始化安装
  14. 汽车导航中,导航引擎与导航地图的关系
  15. 一篇文章吃透:为什么加载数据库驱动要用Class.forName()
  16. 配色那么差,还不‘哥屋恩’去看电影!
  17. “联通云”正式浮出水面 要讲出云计算怎样的“新故事”?
  18. Unity(十七) 在Unity中Android使用FTP进行上传、下载、文件创建(客户端部分)
  19. Error: Cannot find module ‘@/views/xxx‘ at webpackEmptyContext
  20. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

热门文章

  1. 关于CentOS中jdk配置版本不一致的问题
  2. python培训机构调研最多的股票_使用python爬取东方财富网机构调研数据
  3. 红外模块 51单片机
  4. 抖音带货直播后主播怎么进行复盘?抖音直播主播复盘数据分析
  5. 特别行动队[斜率优化]
  6. Comparator类中的compare(T o1,T o2)和compareTo()的使用与疑惑解答
  7. 简单的可靠udp的实现(RUDP)
  8. 【前端学习日记】ElementUi+导航菜单+面包屑+Tag标签联动
  9. PMV泵控制比例溢流阀控制器
  10. mybatis-结果集索引越界