物流相关网站网站数据没有更新
2026/4/18 13:55:42 网站建设 项目流程
物流相关网站,网站数据没有更新,蚌埠网站建设蚌埠,商贸网站建设进程的创建前言前置知识补充#xff08;重要#xff09;pid_t 的本质父进程和子进程exit(0) break continue辨析1. 核心区别对比表2. 逐个拆解#xff08;附代码例子#xff09;#xff08;1#xff09;exit(0)#xff1a;结束“整个程序”#xff08;2重要pid_t 的本质父进程和子进程exit(0) break continue辨析1. 核心区别对比表2. 逐个拆解附代码例子1exit(0)结束“整个程序”2break跳出“当前循环/switch”3continue跳过“本轮循环剩余代码”总结代码初步解读代码进一步解读如何理解调用fork返回两次深入理解结语前言我们在操作系统中 总是说进程的创建 以及进程的切换等等 但是这个创建到底是怎么实现的呢 这个时候就需要借助fork系统调用了所谓的系统调用无非是操作系统给我们用户提供的接口 使得我们能够请求操作系统的帮助去执行一些用户态下执行不了的特权指令等等但是 在真正学习这个之前 我需要对于一些前置知识做出补充 这些都是我自己在学习的时候遇到的困惑 希望能帮到各位参考教材【CSAPP-深入理解计算机系统】前置知识补充重要pid_t 的本质我先把我们本文需要重点理解的代码贴在下面 大家可以先看一下下面这段代码就是C 语言中利用 fork() 创建进程的经典示例其核心是理解父子进程的内存空间独立这个关键点但是劳资看这个main函数怎么看怎么不对 到底哪不对呢 原来是pid这个变量类型我不清楚到底是什么东西于是就有了下文的解释其实pid_t 不是 C 语言的内置类型比如 int/long而是操作系统Linux/Unix在头文件中定义的 “类型别名”目的是统一表示 “进程 ID”。它的实际底层类型通常是 int 或 long简单说pid_t 就是 “进程 ID 的专属类型”本质是整数只是系统给它起了个更专业的名字一般来说这种经典教材上的这个变量名可不是乱取的 所以我们完全可以从英文全称的角度来理解 pid—— Process ID父进程和子进程先建立直观认知父进程 vs 子进程生活比喻你可以把进程理解为 “正在运行的程序”就像一个正在工作的员工父进程相当于公司里的 “老员工”它主动发起指令创建出一个 “新员工”子进程就是这个 “新员工”它从老员工那里复制了一模一样的 “工作资料”代码、变量、内存数据等但拿到资料后两人的工作是独立的 —— 新员工改自己的资料不会影响老员工的反之亦然。exit(0) break continue辨析你想弄清楚exit(0)、continue、break的区别核心可以先记住这三个都是用来“终止/跳过执行流程”的但作用的范围、层级、效果完全不同——exit(0)是“结束整个程序”break是“跳出当前循环/分支”continue是“跳过本轮循环剩余代码”。下面用通俗易懂的方式拆解结合例子让你一眼分清1. 核心区别对比表关键字/函数作用范围核心效果适用场景exit(0)整个进程/程序直接终止当前运行的整个程序返回状态码程序完成任务后退出、出错时终止break当前循环for/while或 switch 分支跳出当前所在的循环/switch执行后续代码满足条件时终止循环/分支continue当前循环for/while跳过本轮循环剩余代码直接进入下一轮循环满足条件时跳过本轮剩余逻辑2. 逐个拆解附代码例子1exit(0)结束“整个程序”本质是一个系统调用函数需要包含stdlib.h不是关键字效果调用后当前运行的进程程序立刻终止所有代码都不再执行0是返回给操作系统的“退出状态码”表示正常退出例子对应你之前的进程代码#includestdio.h#includestdlib.hintmain(){printf(程序开始\n);exit(0);// 程序直接终止printf(这段代码永远不会执行\n);// 不会打印return0;}运行结果只有程序开始后面的代码完全不执行。补充在你之前的父子进程代码中子进程执行exit(0)只会终止子进程本身父进程不受影响因为父子进程是独立的。2break跳出“当前循环/switch”本质C语言关键字效果只能跳出当前所在的一层循环for/while或 switch 语句程序会继续执行循环/switch 之外的代码例子#includestdio.hintmain(){for(inti1;i5;i){if(i3){break;// 跳出整个for循环}printf(i %d\n,i);}printf(循环结束程序继续\n);// 会打印return0;}运行结果i 1 i 2 循环结束程序继续3continue跳过“本轮循环剩余代码”本质C语言关键字效果不跳出循环只是跳过当前轮次中continue之后的代码直接进入下一轮循环的条件判断例子#includestdio.hintmain(){for(inti1;i5;i){if(i3){continue;// 跳过本轮剩余代码进入下一轮}printf(i %d\n,i);}printf(循环结束\n);return0;}运行结果缺少i3i 1 i 2 i 4 i 5 循环结束总结exit(0)终止整个程序/进程是“最高级”的终止break终止当前循环/switch程序继续执行后续代码continue跳过本轮循环剩余代码循环本身继续执行。代码初步解读在知道上面这些之后我们再来看这段代码就大概能看出来在做一件什么事情了首先定义了两个变量pid x 并且将x的初始值置为1 然后用pid用于接收fork函数的返回值接下来就是一个if语句 一旦pid0 那么 就将x1后 打印出来 childx _____ 终止进程如果没有进入就将x-1之后 再打印parentx_____ 终止进程主要就是x以及x的区别这个时候我自己就非常疑惑 为什么会终止两次呢 这个时候就需要理解我们的fork系统调用到底做了一件什么事情代码进一步解读如何理解调用fork返回两次通常来说 调用一次函数只会返回一次 但是调用fork确确实实的是会返回两次的一次是返回到父进程 一次是返回到新创建的子进程上面这张图片的右上角 就是我们执行输出的最终结果 这时候出现了一种奇怪的现象 为什么会打印出来两个结果呢 这本质上和上面为什么要终止两次进程是一个道理我们可以通过右下角的流程图得到答案对应在代码中我们可以将main函数认为是父进程 在父进程中我们通过调用fork创建出子进程 返回值为0执行 main() 函数的初始进程就是父进程它的 x1调用 fork() 后系统复制出一个子进程子进程一开始也有 x1复制父进程的子进程执行 x 把自己的 x 改成 2父进程执行 --x 把自己的 x 改成 0两者互不干扰。深入理解总的来说 我们必须要明白的是 父进程和子进程是独立的进程 都有自己的私有地址空间 执行互不干扰并且这个时候我们就完全可以理解:为什么会有两个输出结果 其原因就是父进程调用fork函数时 标准输出文件是打开的 而子进程继承了父进程所有打开的文件结语玛德 有种就放我进复试 球球 真没招了 本想抄个底 现在还真不知道到底是抄底还是抄顶 O(∩_∩)O哈哈~

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

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

立即咨询