微信网站开发与网站实质区别怎样做网站 - 百度

张小明 2026/1/3 12:36:19
微信网站开发与网站实质区别,怎样做网站 - 百度,万网域名注册官网,114推广平台一、进程的 8 种终止方式#xff1a;正常与异常的边界 进程终止分为正常终止和异常终止两大类#xff0c;共 8 种常见方式。二者的核心区别在于#xff1a;正常终止是进程主动完成任务后退出#xff0c;退出状态由用户指定#xff1b;异常终止是进程因外部信号或内部错误…一、进程的 8 种终止方式正常与异常的边界进程终止分为正常终止和异常终止两大类共 8 种常见方式。二者的核心区别在于正常终止是进程主动完成任务后退出退出状态由用户指定异常终止是进程因外部信号或内部错误被迫退出退出状态由内核决定。1.1 正常终止主动退出可控清理正常终止包含 4 种方式均会按照预设逻辑完成资源释放部分方式还会执行完整的清理流程。main 函数中的 return 语句这是最常见的进程终止方式但需注意return仅在main函数中触发进程终止在普通函数中仅表示函数返回。main函数中return n等价于exit(n)其中n为用户指定的退出状态码。exit () 函数C 标准库的全量清理方案函数原型为void exit(int status);属于 C 标准库函数其核心特性是退出前执行完整的清理流程刷新所有标准 IO 缓冲区例如printf未用fflush刷新的内容会被输出执行通过atexit()或on_exit()注册的自定义清理函数关闭所有打开的文件描述符最终调用_exit()系统调用完成进程终止。状态码约定EXIT_SUCCESS值为 0表示执行成功EXIT_FAILURE值为 1表示执行失败。_exit ()/_Exit () 函数系统调用的极速终止函数原型为void _exit(int status);属于 Linux 系统调用其核心特性是无任何额外清理操作不刷新 IO 缓冲区不执行atexit()注册的清理函数仅关闭打开的文件描述符直接释放进程资源并终止。适用场景需要快速终止进程且无需保留缓冲区数据的场景。主线程退出或 pthread_exit 调用针对多线程进程终止逻辑与线程状态强相关若主线程退出且进程中无其他非分离线程运行则进程终止若主线程调用pthread_exit()仅主线程终止其他线程可继续执行直到所有线程结束进程才会终止。1.2 异常终止被动退出内核主导异常终止同样包含 4 种方式进程无法自主控制退出时机退出状态由内核根据终止原因分配。abort () 函数强制生成核心转储函数原型为void abort(void);其功能是向进程发送SIGABRT信号。该信号无法被捕获或忽略会强制终止进程并生成核心转储文件core dump用于调试程序崩溃的根本原因。kill 命令或 kill () 系统调用外部信号触发终止这是通过外部信号终止进程的常用方式分为两种操作形式命令行层面使用kill -信号名 PID命令例如kill -9 1234发送SIGKILL信号强制终止 PID 为 1234 的进程程序层面调用kill()系统调用例如kill(pid, SIGKILL)向指定 PID 的进程发送终止信号。常见终止信号SIGKILL9 号信号强制终止无法拦截SIGTERM15 号信号请求终止是kill命令的默认信号。最后一个线程被 pthread_cancel 取消多线程进程中若最后一个存活的线程被pthread_cancel()函数取消则进程会触发异常终止终止逻辑由内核的信号机制主导。触发致命错误内核发送终止信号进程运行时触发内部错误内核会自动发送对应信号终止进程常见场景包括访问非法内存地址触发SIGSEGV信号执行除以 0 的运算总线错误触发SIGBUS信号等。二、exit ()、_exit () 与 return执行流程的核心差异正常终止的三种核心方式main函数return、exit()、_exit()其底层执行逻辑存在明显差异关键在于是否执行清理操作、是否刷新缓冲区。三者的完整执行流程对比如下终止方式完整执行流程核心差异点main 函数中return nreturn n→ 调用exit(n)→ 刷新 IO 缓冲区 → 执行atexit清理函数 → 关闭文件描述符 → 调用_exit()→ 终止进程依赖exit()完成全量清理仅在main函数中生效exit(n)exit(n)→ 刷新 IO 缓冲区 → 执行atexit清理函数 → 关闭文件描述符 → 调用_exit()→ 终止进程主动触发全量清理可在程序任意位置调用_exit(n)_exit(n)→ 关闭文件描述符 → 直接终止进程无任何额外清理操作进程极速终止验证示例缓冲区刷新差异我们可以通过一个简单的代码示例直观感受三者的缓冲区处理差异#include stdio.h #include stdlib.h #include unistd.h // 测试 exit()会刷新缓冲区 void test_exit() { printf(测试 exit() 缓冲区); // 无换行符默认不刷新缓冲区 exit(EXIT_SUCCESS); // 执行 exit 会触发缓冲区刷新 } // 测试 _exit()不刷新缓冲区 void test__exit() { printf(测试 _exit() 缓冲区); // 无换行符缓冲区未刷新 _exit(EXIT_SUCCESS); // 直接终止不处理缓冲区数据 } int main() { // 取消注释分别测试 // test_exit(); // test__exit(); return 0; }运行结果执行test_exit()输出测试 exit() 缓冲区执行test__exit()无任何输出。三、进程退出状态的传递与解析进程终止时会将退出状态信息传递给父进程这些信息包括终止类型正常 / 异常、状态码 / 终止信号编号等。父进程需要通过wait()或waitpid()函数获取这些信息同时完成子进程资源的回收。3.1 核心解析宏提取退出状态信息父进程通过wait()/waitpid()获取的status参数是一个整数内核通过该整数封装了子进程的终止详情。Linux 提供了 4 个核心宏来解析该值宏功能说明WIFEXITED(status)判断子进程是否正常终止return/exit ()/_exit ()返回非 0 表示是0 表示否WEXITSTATUS(status)仅WIFEXITED(status)为真时有效获取正常终止的状态码如exit(8)中的 8WIFSIGNALED(status)判断子进程是否被信号异常终止返回非 0 表示是0 表示否WTERMSIG(status)仅WIFSIGNALED(status)为真时有效获取终止子进程的信号编号如 9 表示SIGKILL3.2 代码示例解析子进程退出状态#include stdio.h #include unistd.h #include sys/wait.h #include stdlib.h #include signal.h int main() { pid_t pid1 fork(); if (pid1 -1) { perror(fork pid1 failed); return EXIT_FAILURE; } if (pid1 0) { // 子进程1正常终止状态码 8 printf(子进程1PID:%d正常退出状态码 8\n, getpid()); exit(8); } pid_t pid2 fork(); if (pid2 -1) { perror(fork pid2 failed); return EXIT_FAILURE; } if (pid2 0) { // 子进程2等待被信号终止 printf(子进程2PID:%d等待被 SIGKILL 终止...\n, getpid()); sleep(5); exit(EXIT_SUCCESS); } // 父进程回收子进程1正常终止 int status; pid_t ret waitpid(pid1, status, 0); if (ret 0) { printf(回收子进程1PID:%d:\n, ret); if (WIFEXITED(status)) { printf( - 终止类型正常终止\n); printf( - 退出状态码%d\n, WEXITSTATUS(status)); } } // 父进程发送 SIGKILL 终止子进程2 kill(pid2, SIGKILL); ret waitpid(pid2, status, 0); if (ret 0) { printf(回收子进程2PID:%d:\n, ret); if (WIFSIGNALED(status)) { printf( - 终止类型信号终止\n); printf( - 终止信号编号%d\n, WTERMSIG(status)); } } return EXIT_SUCCESS; }运行结果子进程1PID:12345正常退出状态码 8 子进程2PID:12346等待被 SIGKILL 终止... 回收子进程1PID:12345: - 终止类型正常终止 - 退出状态码8 回收子进程2PID:12346: - 终止类型信号终止 - 终止信号编号9四、进程终止后的特殊状态僵尸进程与孤儿进程父进程与子进程的终止顺序不同会产生两种特殊的进程状态 —— 僵尸进程和孤儿进程。二者对系统资源的影响差异巨大是 Linux 进程管理中必须重点关注的内容。4.1 僵尸进程子死父不埋资源泄漏隐患定义父进程创建子进程后子进程先终止但父进程未调用wait()/waitpid()函数回收子进程的PCB进程控制块此时子进程的用户空间内存已释放但内核空间的 PCB 仍存在这类进程称为僵尸进程。危害PCB 会占用内核内存资源若父进程长期运行且频繁创建子进程会导致系统中积累大量僵尸进程耗尽内核内存进而引发系统不稳定甚至崩溃。查看方式使用ps命令查看进程状态僵尸进程的状态标记为Zps aux | grep Z使用top命令时僵尸进程的数量会显示在zombie列中。解决方法wait ()/waitpid () 主动回收父进程通过调用wait()或waitpid()函数可主动回收子进程的 PCB释放内核资源。二者的核心特性对比如下函数原型核心特性wait()pid_t wait(int *status)阻塞等待任意一个子进程终止回收其 PCB失败返回 -1waitpid()pid_t waitpid(pid_t pid, int *status, int options)可指定回收特定 PID 的子进程支持非阻塞模式WNOHANG无待回收子进程时返回 0waitpid () 非阻塞回收示例#include stdio.h #include unistd.h #include sys/wait.h #include stdlib.h int main() { pid_t pid fork(); if (pid -1) { perror(fork failed); return EXIT_FAILURE; } if (pid 0) { // 子进程睡眠3秒后退出 printf(子进程PID:%d睡眠3秒后退出\n, getpid()); sleep(3); exit(10); } else { int status; while (1) { // 非阻塞模式回收指定子进程 pid_t ret waitpid(pid, status, WNOHANG); if (ret 0) { // 成功回收 printf(回收子进程PID:%d状态码:%d\n, ret, WEXITSTATUS(status)); break; } else if (ret 0) { // 暂无子进程退出父进程执行其他任务 printf(暂无子进程退出父进程执行其他任务...\n); sleep(1); } else { // 回收失败 perror(waitpid failed); break; } } } return EXIT_SUCCESS; }4.2 孤儿进程父死子无依系统自动接管定义父进程创建子进程后父进程先终止子进程失去父进程这类进程称为孤儿进程。处理机制Linux 系统中孤儿进程会被init 进程PID1接管init 进程会成为孤儿进程的新父进程。当孤儿进程终止时init 进程会自动调用wait()函数回收其 PCB因此孤儿进程不会像僵尸进程那样占用系统资源通常无需人工干预。代码示例孤儿进程的产生与接管#include stdio.h #include unistd.h #include stdlib.h int main() { pid_t pid fork(); if (pid -1) { perror(fork failed); return EXIT_FAILURE; } if (pid 0) { // 子进程 printf(子进程PID:%d原父进程PID:%d\n, getpid(), getppid()); sleep(3); // 等待父进程终止 printf(子进程PID:%d新父进程PID:%d\n, getpid(), getppid()); } else { // 父进程立即退出 printf(父进程PID:%d即将退出\n, getpid()); exit(EXIT_SUCCESS); } return EXIT_SUCCESS; }运行结果父进程PID:12347即将退出 子进程PID:12348原父进程PID:12347 子进程PID:12348新父进程PID:1五、总结进程终止分为正常和异常两类共 8 种方式核心差异在于是否主动退出、是否执行清理流程main函数return依赖exit()完成清理exit()执行全量清理后调用_exit()_exit()则直接终止进程父进程通过wait()/waitpid()结合解析宏可获取子进程的终止状态并回收资源僵尸进程是 “子死父不埋”需父进程主动回收孤儿进程是 “父死子无依”由 init 进程接管无资源风险。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

巴中建设厅网站电话佛山著名网站建设公司

在数字设计的海洋中,色彩是连接创意与现实的桥梁。想象一下,当你需要为品牌设计一套完整的色彩系统时,面对单一基础色,如何快速生成10个深浅不一的衍生色?传统的手动调色不仅耗时耗力,还难以保证色彩过渡的…

张小明 2026/1/2 11:00:36 网站建设

济南市网站建设企业培训心得总结怎么写

EmotiVoice在远程办公会议中的辅助应用设想 在一场跨时区的线上项目复盘会中,AI助手用CEO熟悉的声音、带着欣慰的语气播报:“本次迭代提前完成,客户反馈非常积极。”——这句简短总结不仅传递了信息,更唤起了团队成员的情感共鸣。…

张小明 2026/1/2 11:18:44 网站建设

网站开发人员绩效考核表福州做网站开发需要多少钱

智能机器人的“关键技能”是一个由硬件和软件深度融合构成的复杂系统。我们可以将这些技能分为几个核心层次,从感知世界到最终的执行行动。以下是智能机器人的关键技能体系,从基础到高级排列:一、 感知技能 - “认识世界”这是机器人获取和理…

张小明 2026/1/2 11:19:04 网站建设

做网站界面需要注意什么问题国外做健康的网站

前四篇,我们已经把一整套“大模型落地环境”铺好了: 用 Ollama 把开源大模型跑在本地学会 API 调用 LLM 封装把 AI 塞进 VS Code Remote SSH尝试了更偏工程和性能的 vLLM 推理框架 但这一步都会有一个真实的疑问: “环境是搭好了&#x…

张小明 2026/1/2 22:05:01 网站建设

电商网站设计案例外贸网站建设服务平台

Vim自动补全功能全解析 1. 自动补全功能概述 自动补全功能能够避免我们逐字输入完整的单词。当我们输入一个单词的开头字母后,Vim会生成一个建议词尾的列表,让我们从中选择心仪的单词。要充分利用Vim的自动补全功能,需要掌握两个关键要点:一是如何调出最相关的建议列表,…

张小明 2026/1/2 22:55:58 网站建设