做网站对比报告公司的网站

张小明 2026/1/19 19:15:46
做网站对比报告,公司的网站,phpcms仿站,网络营销是什么的一项活动在Linux系统中#xff0c;进程是程序执行的基本单位。理解进程如何结束、父进程如何回收子进程资源#xff0c;以及进程如何执行新的程序#xff0c;是掌握系统编程的关键。本篇博客将深入探讨进程的终止、等待和程序替换。一、进程终止当一个进程完成其任务或遇到异常时进程是程序执行的基本单位。理解进程如何结束、父进程如何回收子进程资源以及进程如何执行新的程序是掌握系统编程的关键。本篇博客将深入探讨进程的终止、等待和程序替换。一、进程终止当一个进程完成其任务或遇到异常时它需要终止。进程终止的本质是操作系统回收其占用的资源如内存、文件描述符等。1. 进程退出的场景进程退出主要有三种场景代码运行完毕结果正确这是最理想的情况。代码运行完毕结果不正确程序逻辑执行完成但可能由于输入或逻辑错误得到了错误的结果。代码异常终止进程在运行过程中被信号如SIGSEGV段错误终止。2. 进程退出的方法正常终止从main函数返回return 0等同于调用exit(0)。调用exit函数这是标准的库函数在终止进程前会执行清理工作。调用_exit或_Exit函数这是系统调用直接终止进程不做任何清理。异常退出通过CtrlC产生SIGINT信号终止进程。其他信号如kill -9发送的SIGKILL。3. 退出码进程退出时会有一个退出码用于向启动它的进程通常是父进程或Shell报告自己的终止状态。可以通过echo $?命令查看上一个命令的退出码。常见的退出码及其含义如下退出码解释0​命令成功执行​1通用错误代码2命令或参数使用不当126权限被拒绝或无法执行127未找到命令PATH错误128n命令被信号终止n为信号编号130 (1282)通过CtrlC(SIGINT) 终止143 (12815)通过 SIGTERM默认终止信号终止注意_exit(int status)函数中虽然status是int类型但只有低8位会被父进程使用。所以_exit(-1)在 Shell 中查看到的退出码是255。4.exit与_exit的区别这是理解进程终止的一个关键点。_exit系统调用。直接使进程终止立即关闭所有文件描述符不会刷新flush标准I/O缓冲区。exit库函数。它在调用_exit之前会先执行以下清理工作执行用户通过atexit()或on_exit()注册的清理函数。关闭所有打开的流标准I/O流如stdout并将缓冲区中的数据写入文件。示例对比// 示例1使用 exit int main() { printf(hello); // 注意字符串后没有换行符 \n exit(0); } // 运行结果输出 hello // 因为 exit 会刷新缓冲区将 hello 写入标准输出。 // 示例2使用 _exit int main() { printf(hello); _exit(0); } // 运行结果可能没有任何输出 // 因为 _exit 直接终止进程缓冲区中的 hello 未被刷新。二、进程等待1. 为什么需要进程等待当一个子进程先于父进程终止时如果父进程不采取任何措施子进程就会进入“僵尸进程”​ 状态。僵尸进程的危害僵尸进程保留了其在内核中的进程描述符等少量资源如果父进程一直不回收会导致资源泄漏内存泄漏。更严重的是僵尸进程“刀枪不入”连kill -9也无法杀死。获取子进程信息父进程需要通过等待来获取子进程的退出状态判断其是正常结束还是异常退出以及正常的退出码是多少。因此进程等待​ 是父进程的责任其主要目的有两个回收子进程资源防止僵尸进程的产生。获取子进程的退出信息。2. 进程等待的方法主要有两个函数wait和waitpid。wait函数#include sys/types.h #include sys/wait.h pid_t wait(int *status);作用阻塞等待任意一个子进程退出。参数status是一个输出型参数用于获取子进程的退出状态。如果不关心状态可设置为NULL。返回值成功则返回被等待子进程的PID失败返回-1。waitpid函数#include sys/types.h #include sys/wait.h pid_t waitpid(pid_t pid, int *status, int options);作用功能更强大可以等待指定的子进程并支持非阻塞模式。参数pidpid -1等待任意一个子进程与wait等效。pid 0等待进程ID等于pid的子进程。status同wait。options0默认选项表示阻塞等待。WNOHANG表示非阻塞等待。如果指定的子进程没有结束则waitpid立即返回0不等待。返回值成功时返回收集到的子进程的PID。如果设置了WNOHANG且子进程未退出则返回0。调用失败返回-1。3. 如何解析 status 参数status参数不能简单地当作一个整数来看待而应该将其视为一个位图。它的低16位包含了退出信息在32位系统上。我们通常使用宏来安全地解析这些信息WIFEXITED(status)如果这个宏为真非零表示子进程是正常终止​ 的。WEXITSTATUS(status)如果WIFEXITED为真此宏用于提取子进程的退出码即exit或return的参数。WIFSIGNALED(status)如果这个宏为真表示子进程是被信号终止​ 的异常退出。WTERMSIG(status)如果WIFSIGNALED为真此宏用于获取导致子进程终止的信号编号。示例代码int main(void) { pid_t pid; if ((pid fork()) -1) { perror(fork); exit(1); } if (pid 0) { // 子进程 sleep(20); exit(10); // 子进程正常退出退出码为10 } else { // 父进程 int st; int ret wait(st); if (ret 0) { if (WIFEXITED(st)) { // 正常退出 printf(Child exit code: %d\n, WEXITSTATUS(st)); // 输出 10 } else if (WIFSIGNALED(st)) { // 被信号杀死 printf(Child killed by signal: %d\n, WTERMSIG(st)); } } } return 0; }三、进程程序替换fork创建的子进程默认执行的是父进程相同的代码。如果我们希望子进程去执行一个全新的、不同的程序例如在Shell中输入ls命令就需要用到进程程序替换。1. 替换原理进程程序替换的核心函数是exec系列函数。当进程调用exec函数时该进程的用户空间代码和数据完全被新程序替换并从新程序的main函数开始执行。关键点exec函数并不创建新的进程。调用前后进程的PID保持不变。它只是用磁盘上的一个新程序替换了当前进程的代码段、数据段等。2. exec 函数族有6个以exec开头的函数它们功能相同但参数传递方式不同。#include unistd.h int execl (const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char *const envp[]); int execv (const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);命名规律l (list)参数采用列表​ 形式逐个传入以NULL结尾。例如execl(/bin/ls, ls, -l, NULL)。v (vector)参数放入一个字符串数组​ 中传入数组最后一个元素必须是NULL。例如char *const argv[] {ls, -l, NULL}; execv(/bin/ls, argv);p (path)带有p的函数会自动在环境变量 PATH​ 指定的目录中搜索可执行文件无需写全路径。例如execlp(ls, ls, -l, NULL)。e (environment)带有e的函数需要用户自己组装并传入环境变量​ 数组envp[]不使用当前进程的环境变量。重要特性exec函数只有在调用失败时才有返回值-1。如果调用成功则执行新程序原程序的后续代码不会再执行。3. 函数关系实际上只有execve是真正的系统调用其他五个函数都是库函数它们最终都会封装execve来实现功能。其关系如下图所示---------- ---------- ---------- | execl | | execv | | execlp | ... (Library Functions) ---------- ---------- ---------- | | | v v v ------------------------------------------------- | execve | (System Call) -------------------------------------------------总结与实践微型Shell将进程创建fork、进程等待waitpid和进程替换exec结合起来就能理解Shell的工作原理。一个简单的Shell流程如下获取命令行显示提示符读取用户输入的命令。解析命令行将命令字符串解析为命令名和参数列表。创建子进程使用fork。子进程程序替换在子进程中使用execvp执行命令。父进程等待子进程退出使用waitpid等待子进程结束防止其变成僵尸进程。这个过程完美体现了“调用/返回”​ 的对称性在函数中call调用函数函数return返回。在进程间fork创建子进程子进程exec执行新程序新程序exit退出父进程wait回收。通过编写一个微型的Shell代码已在你提供的文档中可以极大地加深对进程控制的理解。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

移动端快速建站成都市网络营销

10大论文选题工具核心对比 排名 工具名称 核心功能 效率评分 适用场景 1 aicheck 智能选题大纲生成 ★★★★★ 完全无头绪时的选题生成 2 aibiye 选题优化可行性分析 ★★★★☆ 已有初步方向的优化调整 3 知网 学术资源库选题参考 ★★★★☆ 专业领域深度…

张小明 2026/1/17 16:16:21 网站建设

网站中文域名续费是什么情况建筑公司网址大全

AutoDock Vina批量分子对接终极指南:从效率瓶颈到高效实战突破 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 在药物筛选和分子互作研究中,科研人员常常面临一个共同挑战&#xff1a…

张小明 2026/1/17 16:16:24 网站建设

浙江建设信息港网址佛山百度快速排名优化

如何用 GLM-TTS 克隆方言语音?实测粤语、川渝话合成效果 在智能语音助手越来越“标准”的今天,你是否也曾怀念过那一口地道的乡音?当导航用普通话提醒“前方路口右转”,如果换成一句“喂~转右啊老表!”会不…

张小明 2026/1/17 16:29:49 网站建设

怎么自己优化网站广告素材网

7分钟上手AI代码助手:Code Llama智能编程实战指南 【免费下载链接】CodeLlama-7b-hf 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/CodeLlama-7b-hf 还在为重复的编码任务头疼吗?🤔 面对复杂的函数逻辑不知所措&#xff…

张小明 2026/1/17 16:16:24 网站建设

建设摩托车官方网站哪些网站可以做h5

00. 引言 说实话,这两年追开源模型,我的心态已经从最初的“卧槽牛逼”变成了现在的“审美疲劳”。 每周都有新模型号称“拳打GPT,脚踢Claude”,结果实测,翻车的不少。但就在昨天,我在刷推特(X)的时候&…

张小明 2026/1/17 16:16:26 网站建设

有没有专门做名片的网站适合个人做的网站

第一章:环境监测数据异常值处理概述在环境监测系统中,传感器采集的数据常因设备故障、传输干扰或极端环境因素产生异常值。这些异常值若未被及时识别与处理,将严重影响数据分析的准确性与决策系统的可靠性。因此,建立科学有效的异…

张小明 2026/1/17 16:16:26 网站建设