wordpress做招聘网站中国海外旅游营销网站

张小明 2026/1/9 5:23:55
wordpress做招聘网站,中国海外旅游营销网站,网站备案多个域名,seo排名优化工具推荐进程创建1. fork 的本质#xff1a;一次调用#xff0c;两次返回这是 fork 最让初学者困惑的地方。函数原型#xff1a;#include unistd.h pid_t fork(void);现象#xff1a; 你在代码里只写了一行 fork()#xff0c;但程序运行后#xff0c;这一行代码似乎“执行…进程创建1.fork的本质一次调用两次返回这是fork最让初学者困惑的地方。函数原型#include unistd.h pid_t fork(void);现象 你在代码里只写了一行fork()但程序运行后这一行代码似乎“执行”了两次并且返回了两个不同的值 。为什么会有两次返回当你的程序执行到fork()函数内部时控制权转移到了操作系统内核。内核做了一件惊天动地的事复制内核以父进程为模板克隆了一个一模一样的子进程。子进程也有自己的 PCB (task_struct)。子进程也有和父进程一样的代码、数据、文件描述符等。关键点子进程的程序计数器 (PC)记录代码执行到哪一行了也和父进程一样都指向fork()函数刚刚执行完的位置 。分裂当内核处理完复制工作准备从fork()函数返回时系统中已经有了两个正在运行的进程父进程和子进程。返回内核让父进程从fork返回带回子进程的 PID。内核让子进程从fork返回带回0。2. 深入理解返回值为什么是 0 和 PID设计这两个不同的返回值是有深刻用意的 父进程返回子进程 PID父进程可能生了很多孩子调用多次fork。父进程必须拿到这个 ID才能在将来通过waitpid(pid)准确地找到并回收这个特定的子进程或者给它发信号。子进程返回 0子进程不需要fork告诉它父进程是谁因为子进程可以随时调用getppid()获取父进程 ID。更重要的是返回 0 是为了让子进程知道“我就是那个被创造出来的新生命”。出错返回 -1如果系统进程太多内存不足或 PID 耗尽创建失败只会在父进程返回 -1 。灵魂拷问同一个变量id怎么可能既等于 0 又大于 0看这段经典代码pid_t id fork(); if (id 0) { // 子进程逻辑 } else if (id 0) { // 父进程逻辑 }解释 并非同一个变量同时有两个值。而是在两个独立的进程空间里各有一个叫id的变量。父进程里的id变量被赋值为子进程 PID比如 1234。子进程里的id变量被赋值为 0。 它们只是名字相同但在物理内存中是完全隔离的两个变量 。3. 核心机制写时拷贝 (Copy-On-Write, COW)这是 Linuxfork高效的秘诀。如果不理解这个你就无法理解为什么fork即使拷贝几 GB 内存的进程也极其迅速。误区早期 Unix 的fork是“傻拷贝”父进程有 1GB 内存fork就立马申请 1GB 物理内存把数据全部拷贝一份给子进程。这既浪费时间又浪费内存。真相Linux 的惰性策略Linux 采用了写时拷贝技术 Fork 刚完成时只读共享父子进程的页表虚拟地址到物理地址的映射表是完全一样的。它们指向同一块物理内存。关键动作内核把这些共享的物理内存页标记为“只读” (Read-Only)。当任意一方试图写入时触发拷贝比如子进程执行g_val 100;。CPU 发现正在往“只读”页面写入数据触发缺页中断 (Page Fault)。内核捕获这个中断发现这是因为 COW 导致的。执行拷贝内核立刻申请一个新的物理内存页把原来的数据拷贝过来把新页面的权限改为“可读写”然后让子进程的页表指向这个新页面。父进程的页表依然指向旧页面权限也恢复为可读写。结论如果父子进程都只读数据不修改物理内存永远共享零拷贝。只有被修改的那一页数据才会被复制。这就是为什么fork极快且节省内存 。4. 虚拟地址的“欺骗”// 伪代码 int g_val 0; if (fork() 0) { g_val 100; printf(%d, %p\n, g_val, g_val); // 输出: 100, 地址: 0x601040 } else { sleep(1); printf(%d, %p\n, g_val, g_val); // 输出: 0, 地址: 0x601040 }现象父子进程打印的g_val地址竟然一模一样0x601040但值却不同。解释0x601040是虚拟地址。父子进程拥有完全一样的虚拟地址空间布局。由于发生了写操作g_val 100触发了写时拷贝。在物理内存层面父进程的0x601040映射到物理页 A。子进程的0x601040映射到物理页 B。用户看到的只是虚拟地址这个“门牌号”却不知道背后指向了不同的“房间” 。进程的退出1. 进程退出的三种场景在 Linux 看来进程退出只有三种情况 1代码跑完结果正确return 0。代码跑完结果不正确return非 0比如文件不存在、权限不足。代码没跑完异常终止程序崩溃了野指针、除零错误或者被信号kill -9杀死了。关键点只有前两种情况正常退出进程的退出码 (Exit Code)才有意义。如果进程是异常终止的被杀死的它的退出码是无意义的我们需要关心的是它是被哪个信号杀死的。2. 退出码 (Exit Code)概念main函数的返回值或者exit(n)中的n。规范0表示成功非0表示失败不同的数字代表不同的错误原因。查看方式在 Shell 中运行完程序后立刻输入echo $?可以查看上一个进程的退出码 2。3. 核心考点exitvs_exit这是面试常客。Linux 提供了两个退出函数虽然结果都是进程结束但过程不同。_exit(int status)身份系统调用 (System Call)直接由内核提供 3。行为冷酷无情。立刻关闭进程回收内存不刷新缓冲区。如果你的printf内容还在缓冲区里没打印出来调用_exit后这些数据就丢了。exit(int status)身份库函数 (Library Function)由 C 标准库提供 4。行为温柔体贴。它在调用_exit之前会做很多收尾工作执行用户注册的清理函数atexit。刷新缓冲区这是最大的区别把没打印出来的printf数据强制刷到屏幕或文件中 5。最后才调用_exit。代码验证printf(hello); // 注意没有 \n数据会暂存在缓冲区 _exit(0); // 屏幕上什么都不会打印因为缓冲区直接被丢弃了 // exit(0); // 如果换成这个屏幕会打印 hello进程的等待子进程死了变成了僵尸 (Zombie)父进程必须负责回收它的资源PCB。1. 为什么要等待防僵尸解决内存泄漏问题 6。获知结果父进程需要知道子进程的任务完成得怎么样是成功了还是被杀死了7。2. 等待的方法wait与waitpidA.wait(int* status)—— 简单粗暴功能等待任意一个子进程退出。行为如果子进程没退父进程就阻塞死等直到有子进程退出为止 8。B. waitpid(pid_t pid, int* status, int options) —— 精准控制 9这是更常用的函数因为它更灵活。pid参数pid 0等待指定的那个子进程比如 PID1234。pid -1等待任意子进程等同于wait。options参数0阻塞等待。和wait一样子进程不完我不走。WNOHANG非阻塞等待。这是高并发程序的关键。父进程会问一下内核“子进程结束了吗”如果没有结束waitpid立刻返回0父进程可以先去干别的事过会儿再来问轮询。如果结束了返回子进程 PID。如果出错了返回 -1。3. 深度解剖status位图wait/waitpid的参数status是一个输出型参数。它不仅仅是一个整数而是一个位图。我们需要像看“验尸报告”一样解读它。我们只关注低 16 位 10位区域含义提取宏高 8 位 (8-15)退出码(正常退出才有意义)WEXITSTATUS(status)低 7 位 (0-6)终止信号(异常终止才有意义)status 0x7F第 7 位Core Dump 标志-判断流程先看低 7 位是否收到信号如果低 7 位是 0说明是正常退出。此时再看高 8 位拿退出码。如果低 7 位不是 0说明是异常退出被杀。此时高 8 位的退出码是无效的不用看。代码示例int status; pid_t ret waitpid(id, status, 0); if (ret 0) { if (WIFEXITED(status)) { // 宏判断是否正常退出 (低7位是否为0) printf(正常退出退出码: %d\n, WEXITSTATUS(status)); } else { printf(异常退出被信号杀死: %d\n, status 0x7F); } }进程的替换我们在fork之后子进程默认执行的是和父进程一样的代码或者父进程代码的副本。但通常我们创建子进程是为了让它去执行一个全新的程序比如你在 Shell 里输入ls是希望运行/bin/ls这个程序而不是再跑一遍 Shell 的代码。这时候就需要exec函数族出场了。1. 替换原理当进程调用exec系列函数时内核会进行一场彻底的“大换血” 清空内核会把当前进程的用户空间完全清空代码段、数据段、堆、栈统统不要了。加载内核找到你指定的那个新程序比如磁盘上的ls可执行文件把它的代码和数据加载到内存中。重置重置程序计数器 (PC)指向新程序的入口通常是_start-main。执行进程开始执行新程序的代码。核心特征 (面试考点)PID 不变这就好比一个人“夺舍”了。躯壳PCB、PID、PPID还是原来那个但灵魂内存里的代码和数据已经完全变成了另一个人 。不创建新进程exec只是用新程序覆盖了旧程序没有产生新的进程 ID。一次调用绝不返回exec函数一旦调用成功当前进程原本后续的代码就直接灰飞烟灭了根本没有机会执行“return”。只有在调用失败时比如找不到文件它才会返回 -1 。2.exec函数族Linux 提供了 6 个以exec开头的库函数它们功能一样只是传参方式不同。记住后缀的含义就能分清了 l (list)参数用列表一个个列出来最后必须以NULL结尾。v (vector)参数放进一个数组 (vector)里传进去。p (path)自动在环境变量PATH里找程序不用写全路径比如写ls就会自动找/bin/ls。e (env)不使用当前环境变量而是自己组装一套环境变量传给新程序。最常用的两个execl/execlp(列表传参) 适合参数已知且少的情况。// 执行 ls -l -a // 这里的第一个 ls 是程序名第二个 ls 是 argv[0]占位但也得写后面是参数 execlp(ls, ls, -l, -a, NULL);execv/execvp(数组传参) 适合参数动态生成的情况比如你自己写的 Shell用户输入的参数个数不确定解析后放在数组里。char *const argv[] {ls, -l, -a, NULL}; execvp(ls, argv);注意只有execve是真正的系统调用 (System Call)其他 5 个都是 C 标准库封装的函数它们底层最终都会调用execve。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建收费网站以绿色为主的网站

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/7 22:28:58 网站建设

h5企业网站只做专题网站策划书

在当今Web开发领域,我们面临着一个看似无解的矛盾:如何在保持用户体验完整性的同时,对第三方代码进行严格的安全控制?传统方案如IFrame虽然提供了隔离性,却在灵活性上大打折扣;而直接嵌入外部脚本又可能带来…

张小明 2026/1/7 22:29:00 网站建设

邯郸网站只做重庆网站建设最大

AutoUnipus终极指南:U校园自动化学习解决方案 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus AutoUnipus是一款专为U校园平台设计的智能学习助手,通过全自…

张小明 2026/1/7 22:29:01 网站建设

南京建站方案专业的聊城做网站费用

第一章:触控轨迹拟合准确率提升92%:Open-AutoGLM工程师不愿透露的细节在移动设备与车载系统的交互场景中,触控轨迹的精准还原直接影响用户体验。Open-AutoGLM 团队近期实现的触控轨迹拟合算法优化,将预测准确率提升了 92%&#xf…

张小明 2026/1/7 22:28:59 网站建设

网站的布局方式有哪些2017做网站赚钱

摘要 随着社会经济的发展和人们生活水平的提高,宠物行业逐渐成为新兴的经济增长点。宠物商城作为宠物产业链中的重要环节,其线上化、智能化管理需求日益增长。传统的宠物商城管理系统存在功能单一、扩展性差、用户体验不佳等问题,难以满足现代…

张小明 2026/1/7 22:29:00 网站建设