找回密码
 立即注册
查看: 485|回复: 0

[linux] Linux之进程管理 - 进程终止

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-6-18 12:30:28 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 2024-6-18 12:32 编辑

1. 引言

linux操作系统中,进程管理是系统管理员和开发者日常工作中不可或缺的一部分。进程终止是进程管理的重要环节,无论是正常退出、异常终止还是被强制杀死。本文将详细介绍Linux系统中进程终止的多种方法和相关原理。

2. 进程终止的基本概念

进程终止意味着进程的执行结束,其占用的资源将被系统回收。进程可以通过以下几种方式终止:

(1) 正常退出:进程完成任务后自行退出。
(2) 异常终止:进程因错误或异常情况退出。
(3) 强制终止:进程被系统或用户强制杀死。

3. 正常退出

3.1 exit()函数

进程可以调用`exit()`函数正常退出。`exit()`函数会执行以下步骤:

(1) 关闭所有打开的文件描述符。
(2) 执行注册的清理函数。
(3) 释放分配的内存。
(4) 返回退出状态给父进程。

示例代码:

#include <stdlib.h>

  1. int main() {
  2.     // 执行一些操作
  3.     exit(0);  // 正常退出
  4. }
复制代码


3.2 _exit()函数

`_exit()`函数与`exit()`类似,但不会执行清理函数。通常在fork()后的子进程中使用。

  1. #include <unistd.h>

  2. int main() {
  3.     // 执行一些操作
  4.     _exit(0);  // 正常退出,不执行清理函数
  5. }
复制代码


4. 异常终止

4.1 断言失败

使用`assert`宏进行断言检查,如果条件不满足则终止进程。

  1. #include <assert.h>

  2. int main() {
  3.     int x = 0;
  4.     assert(x != 0);  // 条件不满足,进程异常终止
  5.     return 0;
  6. }
复制代码


4.2 调用abort()函数

`abort()`函数会立即终止进程,并生成核心转储文件用于调试。

  1. #include <stdlib.h>

  2. int main() {
  3.     // 执行一些操作
  4.     abort();  // 异常终止
  5. }
复制代码


5. 强制终止

5.1 kill命令

`kill`命令用于向进程发送信号,默认发送SIGTERM信号请求进程终止。

列出所有进程:

  1. ps -aux
复制代码

通过PID发送SIGTERM信号:

  1. kill <pid>
复制代码

5.2 kill -9命令

使用`kill -9`命令发送SIGKILL信号强制终止进程,该信号不能被捕获或忽略。

  1. kill -9 <pid>
复制代码

5.3 pkill命令

`pkill`命令根据进程名称或其他属性发送信号终止进程。

根据名称发送SIGTERM信号:

  1. pkill <process_name>
复制代码

根据名称发送SIGKILL信号:

  1. pkill -9 <process_name>
复制代码


5.4 killall命令

`killall`命令用于终止指定名称的所有进程。

终止所有匹配名称的进程:

  1. killall <process_name>
复制代码


强制终止所有匹配名称的进程:

  1. killall -9 <process_name>
复制代码


6. 进程终止后的清理

进程终止后,系统会进行资源清理。父进程可以通过以下方式获取子进程的退出状态:

6.1 wait()函数

`wait()`函数等待子进程终止,并返回其退出状态。

  1. #include <sys/wait.h>
  2. #include <unistd.h>

  3. int main() {
  4.     pid_t pid = fork();
  5.     if (pid > 0) {
  6.         int status;
  7.         wait(&status);  // 等待子进程终止
  8.     } else if (pid == 0) {
  9.         // 子进程执行一些操作
  10.         _exit(0);  // 子进程正常退出
  11.     }
  12.     return 0;
  13. }
复制代码


6.2 waitpid()函数

`waitpid()`函数提供更灵活的等待子进程终止的方法。

  1. #include <sys/wait.h>
  2. #include <unistd.h>

  3. int main() {
  4.     pid_t pid = fork();
  5.     if (pid > 0) {
  6.         int status;
  7.         waitpid(pid, &status, 0);  // 等待指定子进程终止
  8.     } else if (pid == 0) {
  9.         // 子进程执行一些操作
  10.         _exit(0);  // 子进程正常退出
  11.     }
  12.     return 0;
  13. }
复制代码


7. 结论

进程终止是Linux进程管理的重要部分,掌握不同的终止方法和信号机制有助于系统管理员和开发者有效管理系统资源。通过本文的介绍,您应该能够理解并应用各种进程终止方法,希望本文对您有所帮助。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-5 02:31 , Processed in 0.067406 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表