讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

【linux】进程创建与进程终止

小辰吖_1648

小辰吖_1648

发布时间:2025-06-20 14:44:23

|

269人浏览过

|

来源于php中文网

原创

让我们对这段关于linux进程创建和终止的文章进行伪原创处理,同时保持原意不变,并保留图片的原始位置和格式:

  1. 进程创建语言:JavaScript运行次数:0运行复制
#include <unistd.h>
pid_t fork(void);

返回值:子进程返回0,父进程返回子进程ID,错误时返回-1

当进程调用fork函数时,控制权会转移到内核中的fork代码。内核会执行以下操作:

  • 为子进程分配新的内存块和内核数据结构
  • 将父进程的部分数据结构内容复制到子进程
  • 将子进程添加到系统进程列表中
  • fork返回后,开始调度器的调度

【linux】进程创建与进程终止 写时拷贝

【linux】进程创建与进程终止02. 进程终止首先需要明确,终止的目的是什么:

  • 释放曾经占用的代码和数据空间
  • 释放内核数据结构

进程退出场景:

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确(可以通过进程退出码判断这两种情况)
  • 代码异常终止

【linux】进程创建与进程终止 上面的代码中,进程11258是父进程bash,执行echo $?命令,父进程bash可以获取最近一个子进程的退出码。我们之前提到,echo是一个内建命令,打印的是bash内部的变量数据。

【linux】进程创建与进程终止父进程bash为什么需要获取子进程的退出码呢?这是为了了解子进程的退出情况(成功,失败,以及失败的原因)。

进程结束时,可以通过return语句(在函数中)或exit()函数(直接从程序中)指定一个退出码。这个退出码是一个整数,传递给父进程,用于表示子进程的终止状态。

常见的惯例:

  • 0(EXIT_SUCCESS):通常表示成功。程序执行完成且没有错误。
  • 非0(EXIT_FAILURE):通常表示有错误发生。具体的非零值可以用来指示不同类型的错误。

异常终止在操作系统中,进程的异常终止通常是由于一些错误或意外情况导致程序无法正常运行到结束。以下是一些典型的异常终止情况:

  • 程序错误
    • 段错误(Segmentation Fault):程序试图访问其内存空间以外的区域或非法的内存区域。常见于指针错误,如访问未初始化的指针、空指针或已释放的内存。
    • 除零错误:程序尝试进行除以零的运算,这在数学运算中是未定义的。
  • 资源问题
    • 内存耗尽:程序请求更多内存时,如果系统无法分配(如堆内存耗尽),可能会导致程序异常终止。
    • 文件描述符耗尽:程序打开太多文件而没有关闭,达到系统限制,可能导致系统函数失败,影响程序继续运行。
  • 信号
    • 致命信号:
      • SIGSEGV(段错误信号):最常见的程序崩溃原因,通常是由于访问违法的内存地址。
      • SIGABRT(中止信号):通常是由于程序内部发生严重错误或调用 abort() 函数而触发。
      • SIGFPE(浮点异常信号):执行了一个无效的算术运算,比如除以零。
      • SIGKILL:无条件终止程序运行的信号,无法捕获或忽略。
      • SIGTERM:请求终止程序的信号,比 SIGKILL 更温和,允许程序进行清理(关闭文件、释放资源等)操作后退出。
    • 非致命信号(如 SIGINT、SIGHUP 等),如果没有被程序正确处理,也可能导致程序终止。
  • 操作系统干预
    • 死锁检测:操作系统可能终止处于死锁状态的进程以解锁系统资源。
    • 资源超额:操作系统对程序使用的资源(如 CPU 时间、内存使用量)有限制,如果程序超出这些限制,如超过了设定的 CPU 时间,操作系统可能终止这个进程。
  • 运行时异常
    • 未捕获的异常:在一些高级语言中(如 Java、Python),如果程序中发生了异常而没有被捕获和处理,这通常会导致程序异常终止。例如,Python 中未被捕获的 ValueError 或 IndexError。

一旦出现异常,退出码就没有意义了!进程出异常,本质是因为进程收到了操作系统发给进程的信号!

【linux】进程创建与进程终止【linux】进程创建与进程终止 段错误,操作系统提前终止进程

我们可以通过查看进程退出的信号来判断进程为什么会异常!

【linux】进程创建与进程终止首先要确认是否是异常,不是异常的情况下,进程一定是运行完毕了,这时只需查看退出码即可。衡量一个进程的退出情况,我们只需要两个数字:退出码和退出信号!

Linux Omniscient
Linux Omniscient

>全知全能技能Linux版。

下载

【linux】进程创建与进程终止如何终止进程?正常退出:

  • main函数return,表示进程终止(非main函数的return,仅表示函数结束)
  • 代码任意位置调用exit函数,注意:exit函数会导致进程立即退出
  • _exit(),系统调用

异常退出:

  • 通过Ctrl + C触发信号终止

在Unix和类Unix系统中,_exit()和exit()都用于终止进程,但它们在功能和使用场景上有重要的区别。理解这些区别有助于正确地管理程序的终止过程,特别是在涉及资源清理和子进程管理时。

exit()函数由C标准库提供,用于结束程序。它执行几个重要的清理操作,然后调用底层的_exit()或exit_group()系统调用来终止进程。

特点和操作:

  • 刷新缓冲区:exit()会自动刷新所有stdio的缓冲区,将缓冲区内的数据写入文件。这确保了所有挂起的输出(例如,使用printf()产生的输出)都被正确地写出。

【linux】进程创建与进程终止【linux】进程创建与进程终止

  • 执行atexit()注册的函数:如果程序中使用了atexit()注册了任何终止时执行的函数,exit()会在实际终止进程前按注册的逆序调用这些函数。这可以用于执行一些如关闭文件描述符、释放分配的内存等清理工作。
  • 关闭stdio库:关闭所有使用标准I/O库打开的文件等资源。

使用场景主要是普通的应用程序,在需要确保输出数据完整性和执行特定的清理操作时使用。

_exit()函数由POSIX标准指定,直接调用系统级别的退出操作,用于立即结束程序,不执行标准I/O的清理操作和不调用atexit()或者C++的全局对象的析构函数。

特点和操作:

  • 不刷新缓冲区:不处理stdio的缓冲区,如果缓冲区内有未写入的数据,这些数据将丢失。

【linux】进程创建与进程终止【linux】进程创建与进程终止

  • 不执行atexit()注册的函数:任何通过atexit()注册的函数都不会被执行。
  • 立即终止:提供一种确保程序能迅速终止的方式,通常用于子进程退出或者在错误处理中需要立即终止程序时使用。

使用场景主要是在创建子进程后,子进程完成任务立即退出时,或者在程序遇到无法恢复的错误需要立即终止时使用。

  • 使用exit()当你需要正常终止程序,并且需要清理资源(如关闭文件、保存状态等)。
  • 使用_exit()在需要快速退出且不关心资源清理的场景下,比如在子进程中执行了某个任务后,或者在出现严重错误时安全退出。

选择合适的函数可以避免数据丢失和资源泄漏,确保程序的稳定和安全。

return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做exit的参数。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

948

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2901

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

416

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6947

2023.07.18

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn