谁再把kill命令说成“杀死“就应该打屁股了
对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]$ 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;
}
执行结果为:
^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命令说成“杀死“就应该打屁股了相关推荐
- Mysql:kill命令之mysql杀死指定的进程(批操作)
SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE db='op_system_gyj';
- linux用kill命令删除进程,linux 使用kill命令杀死进程的几个办法
常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx ...
- android 命令kill进程号,一定是我打开的姿势不对——Android下使用kill命令杀死指定进程...
环境:Android 5.1.1(已root) 最近有一个需求,需要在Android下杀死指定pid的进程.Android原生API提供了几个接口: (1)android.os.Process.kil ...
- linux下kill命令小结
1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送 ...
- nginx中用到的kill命令
1.kill命令 1.1.kill命令简介 我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止:如果是后台进程,那么需要使用kill命令来终止.(其实C ...
- linux kill一个进程,linux kill命令:(中止一个进程)
1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid - kill -l [ signal ] 3.参数 -s:指定发送的信号. - ...
- Linux kill命令原理及源码实现
在 Linux 环境上工作时,你可能会看到应用程序或命令行进程卡住. 那么在这些情况下,终止它是唯一的出路. Linux 中的 kill 命令(位于 /bin/kill),是一个内置命令,用于手动终止 ...
- Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)
这篇文章主要介绍了Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)的相关资料,需要的朋友可以参考下 在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映.这个时候, ...
- Linux 系统中kill命令杀死进程常用技巧
前言 在Linux的系统中,kill是我们最常见的命令之一. kill,英语中为杀死的意思,顾名思义,就是用来杀死一些东西的命令,在linux中就是用来杀死系统中的进程. 在Windows系统中,如果 ...
最新文章
- HTTP API响应数据规范整理
- @总结 - 4@ 多项式的多点求值与快速插值
- Vue + Element UI——对话框式登录框DEMO
- android toolchain maintain team
- 纪中B组模拟赛总结(2020.2.7)
- hdu2066一个人的旅行(多源点多汇点的最短路径问题)
- cdc工具 postgresql_SQLServer CDC数据通过Kafka connect实时同步至分析型数据库 AnalyticDB For PostgreSQL及OSS-阿里云开发者社区...
- oracle11g安装副武器类,oracle 11g 服务器类
- Java 删除文件夹以及文件夹下的文件
- 【人生苦短,我学 Python】基础篇——字典(Day10)
- 图片在相应页面变化的时候拉长
- Obi - Advanced Rope Simulation 绳索插件学习文档
- RHEL 7.8 64bit MYSQL linux-generic 8.0.20 初始化安装
- 汽车导航中,导航引擎与导航地图的关系
- 一篇文章吃透:为什么加载数据库驱动要用Class.forName()
- 配色那么差,还不‘哥屋恩’去看电影!
- “联通云”正式浮出水面 要讲出云计算怎样的“新故事”?
- Unity(十七) 在Unity中Android使用FTP进行上传、下载、文件创建(客户端部分)
- Error: Cannot find module ‘@/views/xxx‘ at webpackEmptyContext
- 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作
热门文章
- 关于CentOS中jdk配置版本不一致的问题
- python培训机构调研最多的股票_使用python爬取东方财富网机构调研数据
- 红外模块 51单片机
- 抖音带货直播后主播怎么进行复盘?抖音直播主播复盘数据分析
- 特别行动队[斜率优化]
- Comparator类中的compare(T o1,T o2)和compareTo()的使用与疑惑解答
- 简单的可靠udp的实现(RUDP)
- 【前端学习日记】ElementUi+导航菜单+面包屑+Tag标签联动
- PMV泵控制比例溢流阀控制器
- mybatis-结果集索引越界