苏州外贸网站建设推广服务科技让生活更美好作文450字
2026/6/10 4:40:14 网站建设 项目流程
苏州外贸网站建设推广服务,科技让生活更美好作文450字,济宁做网站的企业,电子商务网站建设的书在 Linux C/C 开发中#xff0c;进程管理是系统编程的核心知识点之一。从父子进程的创建、进程的终止到僵尸进程的避免#xff0c;每一个环节都影响着程序的稳定性。本文将从基础概念到实践代码#xff0c;详细讲解 Linux 进程管理的关键技术。一、父子进程#xff1a;写时…在 Linux C/C 开发中进程管理是系统编程的核心知识点之一。从父子进程的创建、进程的终止到僵尸进程的避免每一个环节都影响着程序的稳定性。本文将从基础概念到实践代码详细讲解 Linux 进程管理的关键技术。一、父子进程写时复制的 “副本关系”当我们通过fork()创建子进程时子进程是父进程的 “复制副本”—— 但在现代 Linux2.6 版本后如 Ubuntu 18.04 使用的 Linux 5.4 内核中这个 “复制” 并非完全拷贝而是采用了 ** 写时复制Copy-on-WriteCOW** 机制初始状态子进程与父进程共享同一块内存空间包括代码段、数据段、堆、栈内核仅为子进程创建独立的 PCB进程控制块。写操作触发拷贝当子进程修改某块内存如变量、数组时内核才会为子进程分配新的内存空间并将修改的内容拷贝到新空间中实现 “按需拷贝”。这种机制既节省了内存资源又提升了fork()的效率。二、进程的终止8 种情况分类进程的终止分为 “正常终止” 和 “异常终止” 两类共 8 种场景终止类型具体场景说明正常终止1.main函数中执行return会触发进程退出返回值作为进程退出状态2. 调用exit()函数库函数会执行 I/O 清理刷新缓存、关闭打开的文件再终止进程3. 调用_Exit()函数系统调用仅关闭打开的文件不执行 I/O 清理缓存数据会丢失4. 主线程退出主线程结束后进程会随之终止5. 主线程调用pthread_exit仅主线程退出进程不会终止需所有线程结束异常终止6. 调用abort()函数触发SIGABRT信号强制进程终止7. 通过signal/kill发送终止信号如kill -9 pid强制杀死进程8. 最后一个线程被pthread_cancel取消所有线程结束后进程终止三、退出后的进程僵尸与孤儿进程退出后并非直接 “消失”而是会进入特殊状态1. 僵尸进程Zombie Process产生条件父进程创建子进程后子进程先退出但父进程未调用wait/waitpid回收子进程。表现子进程的用户内存已释放但内核中的 PCB包含进程 PID、退出状态等未被释放进程状态标识为Z可通过ps aux | grep Z查看。危害长期积累的僵尸进程会占用内核内存导致系统资源不足、稳定性下降。2. 孤儿进程Orphan Process产生条件父进程创建子进程后父进程先退出子进程会被系统进程如init、systemd接管。表现子进程的新父进程会自动回收其资源因此孤儿进程不会造成资源泄漏无需额外处理。四、进程退出函数exit 与_exit 的区别进程退出的核心函数是exit库函数和_exit系统调用二者的差异是面试高频考点函数类型核心行为适用场景exit(int status)库函数1. 执行atexit注册的清理函数2. 刷新 I/O 缓存3. 关闭打开的文件4. 调用_exit终止进程需保证数据完整写入如文件操作后_exit(int status)系统调用1. 关闭打开的文件2. 直接终止进程不处理缓存 / 清理函数紧急退出如信号处理函数中示例c运行#include stdio.h #include stdlib.h #include unistd.h int main() { printf(使用exit退出会刷新缓存); exit(EXIT_SUCCESS); // 输出会被打印 } // 对比 int main() { printf(使用_exit退出不刷新缓存); _exit(EXIT_SUCCESS); // 输出不会被打印缓存未刷新 }五、进程回收wait/waitpid 解决僵尸问题为了避免僵尸进程父进程必须主动回收子进程核心函数是wait和waitpid。1. wait 函数c运行pid_t wait(int *status);功能阻塞等待任意一个子进程退出并回收其 PCB。参数status存储子进程的退出状态若不需要传NULL。返回值成功返回被回收子进程的 PID失败返回-1如无待回收子进程。解析退出状态需通过宏函数提取status中的信息WIFEXITED(status)判断子进程是否正常退出返回非 0 表示正常。WEXITSTATUS(status)提取子进程的退出值仅当WIFEXITED为真时有效。WIFSIGNALED(status)判断子进程是否被信号终止。WTERMSIG(status)提取终止子进程的信号编号。2. 实践代码回收子进程并处理退出状态c运行#include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h int main() { pid_t pid fork(); if (pid -1) { perror(fork失败); exit(1); } if (pid 0) { // 子进程执行任务后退出 printf(子进程(pid%d)执行中...\n, getpid()); sleep(2); exit(5); // 正常退出退出值为5 } else { // 父进程回收子进程 int status; pid_t child_pid wait(status); if (child_pid -1) { perror(wait失败); exit(1); } // 解析退出状态 if (WIFEXITED(status)) { printf(回收子进程(pid%d)退出值%d\n, child_pid, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf(回收子进程(pid%d)被信号%d终止\n, child_pid, WTERMSIG(status)); } } return 0; }运行结果plaintext子进程(pid12345)执行中... 回收子进程(pid12345)退出值53. 批量回收waitpid 循环处理多子进程若父进程创建了多个子进程需循环调用waitpid回收所有子进程c运行// 循环回收所有子进程 while (waitpid(-1, status, WNOHANG) 0) { // 处理退出状态... }waitpid(-1, status, WNOHANG)-1表示回收任意子进程WNOHANG表示非阻塞无待回收子进程时直接返回 0。六、实战如何查看僵尸进程通过ps或top命令可查看系统中的僵尸进程ps 命令bash运行ps aux | grep Z输出中状态为Z的进程即为僵尸进程。top 命令进入top后按z可高亮显示僵尸进程或查看 “Zombie” 统计项若大于 0说明存在僵尸进程。总结Linux 进程管理的核心是 “创建 - 终止 - 回收” 的闭环用fork()创建子进程利用写时复制节省资源子进程通过exit/_exit正常退出或被信号异常终止父进程必须通过wait/waitpid回收子进程避免僵尸进程孤儿进程由系统接管无需额外处理。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询