kill进程的几种方式

【Linux随笔】Killall 、Kill 、Pkill三个命令之间的区别

首先三个命令都是用于杀掉进程的,不过kill是杀掉单个进程killall是杀掉所有同名进程pkill是杀掉一类进程或者某个用户的所有进程

一、kill命令

kill 命令的用途

kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释:kill - send a signal to a process.从官方的解释不难看出,kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。事实上如果我们不给 kill 命令传递信号参数,它默认传递终止进程运行的信号给进程!这是 kill 命令最主要的用法,也是本文要介绍的内容。

一般情况下,终止一个前台进程使用 Ctrl + C 就可以了。对于一个后台进程就得用 kill 命令来终止。我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。

kill 命令格式

使用kill -l命令列出所有可用的信号。

最常被使用的信号是1/9/15:

1(HUP):重新加载进程。
9 (KILL):杀死进程。
15(TERM):完美地停止一个进程。
kill pid //同下-15默认的安全停止进程
kill -15 pid //
kill -9 pid  //彻底杀死进程

复制

使用信号 15 是安全的,而信号 9 则是处理异常进程的最后手段,这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。

二、killall命令

Linux killall (kill processes by name)用于杀死进程,与 kill 不同的是killall 会杀死指定名字的所有进程。kill 命令杀死指定进程 PID,需要配合 ps 使用,而 killall 直接对进程对名字进行操作,更加方便。

killall -9 mysql         //结束所有的 mysql 进程

复制

三、pkill命令

pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录。

pkill mysql         //结束 mysql 进程
pkill -u mark,danny //结束mark,danny用户的所有进程
w  //#使用w命令查询本机已经登录的用户
pkill -9 -t pts/1  //#强制杀死从pts/1虚拟终端登陆的进程

复制

四、拓展命令

如果能看懂下面一系列命令,那么killall 、kill 、pkill三个命令之间的区别你也就了然于胸了。

1、pgrep命令:专门显示进程的进程号,相当于:

ps -aux | grep 进程名 | grep -v grep| awk '{print $2}' 

复制

2、pidof命令:pid of xx进程,显示进程的进程号,同上pgrep。

3、组合命令的使用:

pgrep mysql | xargs kill -s 9
ps -ef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9
kill -s 9 `pgrep mysql`

复制

看到上面这三条命令的转换想到了什么吗,联想下pkill命令:pkill=pgrep+kill

pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 “-s 9”,结果每次运行都无法终止进程。

killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

<think>嗯,用户让我介绍一下进程间通信的六种方式。我需要确保自己准确无误地列举并解释这些方法。首先,我得回忆一下操作系统课程中学过的内容。进程间通信(IPC)主要有哪几种呢?常见的包括管道、消息队列、共享内存、信号量、信号,还有套接字对吧?不过可能还有其他的方式,比如内存映射文件或者命名管道,不过通常主要的是六种,可能需要确认一下。 首先,管道(Pipe)。管道分为匿名管道和命名管道。匿名管道只能在有亲缘关系的进程之间使用,比如父子进程。而命名管道(FIFO)则可以在任意进程间通信,通过文件系统中的命名管道文件来实现。需要解释它们的特点,比如半双工,数据流形式,以及容量限制。 然后是消息队列(Message Queue)。消息队列是保存在内核中的消息链表,允许不同进程发送格式化的数据块,每个消息有类型标识。这样接收进程可以根据类型来读取,支持异步通信,不过可能存在性能开销,因为需要在内核和用户空间之间复制数据。 接下来是共享内存(Shared Memory)。共享内存允许多个进程访问同一块内存区域,是最高效的IPC方式,因为数据不需要在进程间复制。但需要同步机制,比如信号量,来防止竞态条件。 信号量(Semaphore)本身其实更多用于进程同步,而不是直接传输数据。它是一个计数器,用来控制多个进程对共享资源的访问。不过通常也被归为IPC的一种方式,因为它协调了进程间的操作。 信号(Signal)是比较原始的通信方式,用于通知接收进程某个事件已经发生。比如中断信号SIGINT,但信号处理比较复杂,不能传递大量数据,主要用于控制。 套接字(Socket)不仅用于同一台主机的进程间通信,还可以跨网络。它支持不同协议,如TCP和UDP,提供更灵活的通信方式,特别是在分布式系统中。 需要确认是否还有其他的方式,比如内存映射文件(Memory-mapped File),但可能这属于共享内存的一种扩展应用。而有些资料可能把信号量和共享内存分开作为两种不同的方式,所以六种应该包括以上提到的:管道、消息队列、共享内存、信号量、信号、套接字。 接下来需要组织语言,按照用户的要求,结构清晰,分点说明每种方式,包括定义、特点、适用场景和优缺点。同时注意使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,不过这个问题可能不太涉及数学公式,但如果有的话需要注意。比如在解释信号量时可能会提到P/V操作,可以用$$来展示。 然后检查是否有错误,比如是否混淆了消息队列和管道的特点,比如消息队列是否有类型,而管道是字节流。共享内存是否需要同步机制,比如信号量通常和共享内存一起使用。套接字的跨网络特性是否正确。 确保每个部分简明扼要,用户可能需要了解每种方法的基本概念和适用情况,以及优缺点,方便他们在实际应用中选择合适的方式。例如,管道简单但容量有限,共享内存高效但需要同步,套接字适用于网络通信等。 最后,可能需要一个总结性的对比表格,但用户没有特别要求表格,所以可能用文字总结。或者分点列出每种方式的特点。总之,要确保信息准确,结构清晰,符合用户的要求。</think>进程间通信(IPC)的六种核心方式及其特点如下,按实现机制和适用场景分类说明: 1. **管道(Pipe)** - **匿名管道** - 单向数据流,仅限父子进程或兄弟进程 - 示例:`$ ls | grep .txt$` - 缺点:生命周期随进程结束,无格式字节流 - **命名管道(FIFO)** - 通过文件系统路径标识,允许无亲缘进程通信 - 示例:`mkfifo /tmp/myfifo` - 缺点:仍为半双工 2. **消息队列(Message Queue)** - 内核维护的链表结构,支持消息类型过滤 - 数据包结构: ```c struct msg_buffer { long msg_type; char msg_text[1024]; }; ``` - 优点:支持异步、非阻塞操作 - 缺点:内核-用户空间数据拷贝影响性能 3. **共享内存(Shared Memory)** - 物理内存直接映射到多进程虚拟地址空间 - 关键系统调用: - `shmget()` 创建共享段 - `shmat()` 附加到进程空间 - 效率对比: $$ \text{传输耗时} \propto \begin{cases} O(n) & \text{传统IPC} \\ O(1) & \text{共享内存} \end{cases} $$ - 必须配合信号量实现同步 4. **信号量(Semaphore)** - 整型计数器实现原子操作 - PV原语: - P操作(`sem_wait()`):资源申请 - V操作(`sem_post()`):资源释放 - 示例防止共享内存冲突: ```c sem_t *sem = sem_open("/mysem", O_CREAT, 0644, 1); sem_wait(sem); // 进入临界区 /* 访问共享资源 */ sem_post(sem); // 离开临界区 ``` 5. **信号(Signal)** - 预定义事件通知机制,如: - `SIGKILL`(强制终止) - `SIGSEGV`(段错误) - 自定义处理函数: ```c void handler(int sig) { /* ... */ } signal(SIGUSR1, handler); ``` - 限制:无法携带上下文信息,仅适合简单事件 6. **套接字(Socket)** - 跨网络通信标准接口,协议栈支持: ```c int sockfd = socket(AF_INET, SOCK_STREAM, 0); ``` - 本地通信优化: - UNIX域套接字(`AF_UNIX`) - 零拷贝技术减少内核开销 **对比总结**: | 方式 | 速度 | 数据量 | 亲缘要求 | 持久性 | 典型场景 | |-------------|--------|--------|----------|--------|-----------------------| | 匿名管道 | 快 | 小 | 必须 | 临时 | Shell命令流水线 | | 命名管道 | 中 | 中 | 无 | 持久 | 本地多进程任务调度 | | 消息队列 | 中 | 中 | 无 | 持久 | 异步任务分发 | | 共享内存 | 最快 | 大 | 无 | 临时 | 高频数据交换 | | 信号量 | - | - | 无 | 持久 | 资源锁 | | 套接字 | 可变 | 大 | 无 | 持久 | 分布式系统/跨机通信 | 实际工程中常组合使用,例如:共享内存+信号量实现高效数据交换,消息队列+套接字构建分布式消息总线。选择时需权衡性能需求、系统复杂度及可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值