Linux 进程控制(二) (进程等待wait/waitpid)

news2026/3/17 14:34:58
目录一、进程等待的重要性二、进程等待的三个问题1. 进程等待是什么?2. 为什么要有进程等待?3. 进程等待是怎么做的?三、先看僵尸进程现象四、wait概念讲解函数功能使用方法阻塞状态五、waitpid概念讲解函数功能使用方法退出码和推出信号waitpid第二个参数int* statuswaitpid等待指定的子进程waitpid等待多个子进程六、非阻塞轮询waitpid第三个参数options七、总结一、进程等待的重要性当子进程退出时若父进程未及时处理将导致僵尸进程的产生进而引发内存泄漏问题。僵尸进程是已经终止但未被回收的进程它们会持续占用系统资源。即使使用 kill -9命令也无法清除因为无法终止一个已经结束的进程。要解决僵尸进程问题父进程必须通过进程等待机制来回收子进程资源并获取子进程退出的状态信息。父进程需要获取子进程的执行状态包括任务是否正常完成、是否出现异常、执行结果是否正确以及错误产生的原因。二、进程等待的三个问题1. 进程等待是什么?进程等待是指父进程通过调用wait或waitpid系统函数实现对子进程的状态监控和资源回收。具体功能包括检测子进程是否已终止若终止则进入Z状态回收子进程资源获取子进程退出信息将子进程状态从Z状态僵尸状态转变为X状态死亡状态2. 为什么要有进程等待?进程等待主要解决两个关键问题处理僵尸进程僵尸进程无法被直接终止必须通过进程等待机制来回收资源避免内存泄漏这是必须解决的问题获取执行状态通过进程等待可以获取子进程的退出状态从而了解子进程的任务完成情况。这个功能可根据实际需求选择使用虽然某些场景下不需要关注子进程状态但为了满足多样化的使用需求操作系统必须提供该功能3. 进程等待是怎么做的?父进程通过调用wait()或waitpid()系统调用来回收子进程从而解决僵尸进程问题。三、先看僵尸进程现象我们通过 fork() 创建父子进程子进程循环3次打印信息后 exit(0) 终止父进程无限循环打印信息未回收子进程最终导致子进程成为僵尸进程。如下所示:僵尸进程产生的核心原因本质是 “子进程先于父进程退出但父进程未执行‘回收子进程资源’子进程退出时会保留少量核心信息如退出码、PID等待父进程通过 wait() / waitpid() 读取此时子进程进入僵尸态Z状态。代码中父进程进入无限 while(1) 循环完全未调用 wait() 或 waitpid() 无法读取子进程退出信息导致子进程残留的资源无法释放永久处于僵尸态直到父进程被手动终止。那么在这个过程中我们使用脚本去监控进程变为僵尸的状态脚本代码如下://脚本代码 while :; do ps ajx | head -1 ps ajx | grep mycommand | grep -v grep; sleep 1; echo -----------------------------; done运行结果:当子进程退出父进程不去等待子进程那么子进程就会变成僵尸进程造成内存泄漏那么我们应该如何解决呢那么就是父进程使用wait/waitpid去等待子进程下面我们先进行介绍wait在进行讲解上述wait之前我们还应该认识到一个事情当前子进程的pid是21926其ppid是21925这个21925就是父进程父进程的pid就是21925同时父进程的ppid是17474其中17474就是父进程的父进程那么我们grep过滤一下查看发现它就是bash即bash是当前父进程的父进程即在命令行中启动的进程是bash的子进程四、wait概念讲解在Linux系统手册第2节中可以查阅到关于wait和waitpid系统调用的详细说明。使用这两个系统调用时需要包含以下头文件#include sys/types.h #include sys/wait.h由于wait的参数status与waitpid功能相关我们将这两者共有的status参数放在waitpid部分统一讲解。wait函数的参数类型是一个int*类型指针实际使用时可以传入NULL值来调用wait等待进程。函数功能wait函数的主要功能是等待当前进程的任意子进程状态改变检测并等待进程进入僵尸(Z)状态获取进程退出信息并释放进程资源成功等待子进程退出时返回子进程的PID(始终大于0)可通过判断返回值是否大于0来确定等待是否成功对于单个子进程的情况可直接比较wait返回值与fork返回值是否相等(fork在父进程中返回子进程PID)若当前进程未创建任何子进程(即没有子进程可等待)wait将返回-1表示失败使用方法那么下面我们使用这个wait让父进程去等待子进程的退出代码中父进程通过 fork() 创建子进程子进程执行 RunChild() 父进程进入 else 分支先休眠4秒。同时子进程循环2次 cnt2 → 1 每秒打印PID/PPID/计数2秒后 exit(0) 终止此时父进程仍在休眠未回收子进程短暂成为僵尸进程。父进程在休眠4秒后调用 wait(NULL) 阻塞等待子进程成功回收后打印“等待成功”再休眠2秒最终父进程正常退出。0-2秒子进程每秒打印1次共2次之后子进程退出。2-4秒子进程已退出父进程仍在 sleep(4) 子进程处于僵尸态Z状态无任何打印。4秒时父进程 wait(NULL) 成功回收子进程打印“我是父进程...子进程的pid: xxx”。4-6秒父进程 sleep(2) 无打印6秒后父进程执行 return 0 退出程序结束。运行结果:我们可以观察到前2秒子进程和父进程都在运行然后过了两秒子进程退出由于父进程此时在休眠无暇等待子进程所以子进程此时会成为僵尸进程再过两秒父进程休眠完成此时等待子进程成功那么此时子进程的资源就被释放了子进程被回收父进程等待子进程完成后并且父进程被设置为休眠2秒所以此时会观察到只有父进程在运行的场景阻塞状态当子进程持续运行且父进程调用wait等待时父进程中的wait函数会持续检测子进程状态直到子进程退出为止。在此期间父进程将无法执行其他代码而是持续在系统调用wait中轮询检测以下信息子进程是否处于Z僵尸状态子进程是否已退出若子进程始终不退出wait调用将无法返回导致父进程进入阻塞状态无法继续执行后续代码。但是为解决此问题我们可以采用waitpid的非阻塞轮询机制来优化处理流程。那么为了演示父进程的阻塞状态我们可以将子进程执行的RunChild函数修改一下让它直接死循环打印当子进程调用它的时候就会一直死循环打印进程信息同时父进程就一直使用wait等待子进程退出即可运行结果:最终结果导致父进程陷入无限等待无法回收永远不会退出的子进程。此时父进程进入阻塞状态处于等待队列中。操作系统会将父进程从CPU运行队列中移除停止对其调度。父进程的PCB会被转移到子进程PCB的等待队列中等待子进程状态变化即子进程退出变为Zombie状态。由此可知进程阻塞不仅发生在等待硬件资源就绪时如scanf等待键盘输入也可能发生在等待软件资源就绪的情况下。这里的父进程就是在等待子进程状态变化即子进程退出变为Zombie状态这一软件资源就绪。五、waitpid概念讲解同样的我们可以通过man 2 waitpid命令查看相关手册使用时需要包含头文件#include sys/types.h #include sys/wait.h函数功能waitpid是wait的增强版它有三个参数第一个参数指定要等待的子进程PID传入-1表示等待任意子进程传入特定PID表示等待指定的子进程第二个参数是指针类型的输出参数用于获取子进程的退出信息。在演示中我们暂时传入NULL表示不获取退出信息后续会详细讲解如何获取。第三个参数控制等待方式传入0表示阻塞等待类似wait)传入WNOHANG表示非阻塞等待非阻塞等待结合循环可实现轮询机制最有意义的用法是在轮询时让父进程同时处理其他任务返回值说明成功等待子进程时返回子进程PID如果指定的PID不是当前进程的子进程则返回-1表示等待失败使用方法我们在父进程中使用waitpid等待子进程退出其中第一个参数传入-1表示等待当前父进程的任意一个子进程退出第二个参数传入NULL表示不想获取子进程的退出信息第三个参数传入0表示进行和wait进行一样的阻塞等待模式运行结果:为什么子进程的退出码为啥是512难道不应该是2吗?实则不然这是因为waitpid的第二个参数获取的status的原因其实waitpid的第二个参数status的设计大有用工waitpid函数的第二个参树status用于获取子进程的完整退出信息包括退出状态、退出码以及core dump标志关于core dump标志将在后续信号相关文章中详细讨论。子进程的退出场景可分为三种情况父进程主要关注两个关键信息子进程是否异常终止若正常终止执行结果是否正确通过退出码判断0表示成功非0表示失败不同数值对应不同错误原因由于需要通过一个整型变量status同时存储退出信号和退出码信息操作系统采用了位运算的方式巧妙利用32位整数的比特位布局。实际应用中我们主要关注前16个比特位当进程异常终止时退出信号为非零值表示异常类型此时不关心退出码对应比特位未被使用当进程正常终止时退出信号为0Linux系统中不存在0号信号故用0表示无异常通过退出码判断执行结果是否正确在linux的信号中我们使用kill -l查看之后发现linux的信号中根本没有0号信号所以使用0来表示进程没有收到退出信号即程序正常运行退出码和推出信号1. 产生主体不同退出码子进程自己通过 exit(n) 或 return n 主动设置是“自愿终止”时的“结果报告”。退出信号Linux内核或其他进程发送的信号如SIGSEGV、SIGKILL是“被迫终止”时的“死亡原因”。2. 含义与用途不同退出码仅表示“正常终止后的执行状态”0执行成功非0执行失败如1参数错、2文件不存在自定义含义。退出信号仅表示“异常终止的原因”每个信号对应一种错误如11段错误、9被强制杀死此时退出码无意义。3. 与status的关联不同用 WIFEXITED(status) 判断退出信号为1时才能用 WEXITSTATUS(status) 取退出码。用 WIFEXITED(status) 判断推出信号为0时才能用 WTERMSIG(status) 取退出信号。1. 异常终止退出信号非0对应具体异常原因退出码无意义进程被强制终止没机会设置。2. 正常终止退出信号为0表示无异常、自愿结束退出码有意义是子进程主动设置的执行结果。只要退出信号非0进程异常终止退出码就完全没意义只有进程通过 exit() / return 主动终止退出信号0退出码才是子进程预先设置的“执行结果报告”有实际含义。一旦退出信号非0比如被SIGSEGV信号打崩进程是“被动猝死”根本没机会执行 exit(n) 去设置退出码——此时status里“退出码对应的比特位”是随机无效值读出来也没有任何参考价值。waitpid第二个参数int* statusstatus的32个比特位的前16位的存储以及如何进行位运算提取对应的退出码和退出信号如下那么此时我们正确进行位运算提取status对应的退出信号和退出码即可运行结果:此时我们的退出信号和退出码就可以正常提取出来了其实操作系统提供了对应提取退出信号和退出码的宏函数来供我们使用通常来讲操作系统提供的WIFEXITED是用来提取status的退出信号的但是这个提取的退出信号会被转化为bool值因为如果出现了异常此时提取出来的退出信号是非0那么说明代码有极大可能是没有执行完子进程收到了退出信号即子进程就出现了异常错误退出码也就没有了意义如果没有出现异常此时提取出来的退出信号就为0此时退出码有意义于是就使用WEXITSTATUS提取status中的退出码于是我们的代码就可以转化成下面这样去进行使用运行结果:让我们思考一个问题当子进程退出时其内核数据结构task_structPCB中会保存退出信息包括退出信号exit_signal和退出码exit_code。那么为什么父进程必须通过wait等系统调用才能获取子进程的状态数据父进程能否直接访问内核空间读取子进程的task_struct数据答案是否定的原因如下进程独立性原则父子进程虽然共享代码和数据但当修改数据时会触发写时拷贝机制使得各自拥有私有副本。因此子进程修改的数据父进程无法直接获取。安全隔离机制操作系统不信任任何用户进程。父子进程的代码由用户编写如果允许父进程直接访问内核空间读取子进程数据就意味着用户可以随意修改内核数据结构这将导致系统混乱。因此必须通过操作系统提供的wait等系统调用来获取子进程数据。实际上父进程可以通过其他方式向子进程传递数据。例如在后续学习中我们会了解到父进程可以通过进程替换传递自定义环境变量给子进程。这些环境变量可以包含任意字符串内容子进程就能据此执行相应操作。waitpid等待指定的子进程waitpid的第一个参数传入子进程的pid就可以让父进程等待指定的子进程但是需要注意这个指定的子进程必须是当前进程的子进程如果是其它的进程那么waitpid将会等待子进程失败返回-1父进程是可以获取到子进程的pid传入waitpid的因为父进程fork创建子进程fork给父进程返回的就是子进程的pid运行结果:waitpid等待多个子进程如果当前进程使用for循环去创建多个子进程的时候我们该如何使用waitpid去进行多个子进程的等待呢那么我们也使用同样的for循环方式去让父进程进行N次等待即可这里的等待是阻塞等待当前进程的任意子进程那么在这个过程中我们将使用脚本去监控进程的状态脚本代码如下//脚本代码 while :; do ps ajx | head -1 ps ajx | grep mycommand | grep -v grep; sleep 1; echo -----------------------------; done运行结果:如上我们就可以同时创建出来的多个子进程并且对这多个子进程进行等待回收这里需要注意由于子进程执行后父进程一直在等待子进程所以子进程在退出的瞬间就会被父进程等待成功进行回收所以这里我们看不到子进程的进入僵尸状态当然如果想观察到子进程的僵尸状态那么可以在两个for循环之间让父进程休眠比单个子进程的休眠时间长即可这样子进程打印休眠结束此时父进程还在休眠无暇等待子进程此时子进程的僵尸状态就可以被我们检测到上面的代码只是演示了如何创建和等待多个子进程,下面我们在此基础上继续演示让多个子进程执行不同的任务,执行完之后父进程进行回收:第8行typedef void (*callback_t)();的意思是定义一个新的类型别名 callback_t用来表示“指向无参、无返回值函数的指针”。拆解一下void (*)() 这是一个函数指针类型表示“指向一个不接收参数、返回值为 void 的函数”。typedef ... callback_t 把这个复杂的类型起一个别名叫做 callback_t 。所以callback_t 就代表“一类函数指针”只要是无参数和返回值是 void 的函数都可以用这个类型来表示第9行的枚举表示定义一组有名字的整型常量用来表示程序的不同退出状态。用 return OK; 比 return 0; 更清楚地表达“程序正常退出”的意图用 exit(USAGE_ERR); 比 exit(1); 更明确地表示“参数使用错误”。需要注意的是枚举默认规则编译器自动赋值枚举里不写数字时编译器自动从 0 开始依次 1第32行CreateChildProcess 函数的作用是根据传入的子进程数量通过 fork 循环创建出多个子进程每个子进程会从任务数组中拿到属于自己的任务并执行执行完就退出而父进程只负责把所有子进程的 PID 记录下来第47行WaitAllChild 函数则是让父进程遍历之前记录的所有子进程 PID通过 waitpid 逐个阻塞等待子进程退出并完成回收同时打印出每个子进程的退出码避免产生僵尸进程。主函数先检查命令行参数是否正确必须传入一个表示进程数量的数字(这里创建的子进程的数量是3)不满足就提示用法并退出接着定义好保存子进程PID的容器和存放任务的函数指针数组提前给每个子进程分配好要执行的Task或Hello任务然后调用创建子进程的函数按指定数量创建子进程并让它们分别执行对应任务最后调用等待子进程的函数让父进程统一等待并回收所有子进程程序正常结束。Task 和 Hello 是两个功能结构完全一样、只是打印内容不同的任务函数它们都会循环5次每秒打印一条信息分别标明当前是哪个子进程在执行 Task 还是 Hello 任务、进程ID、父进程ID以及剩余次数执行完5次后子进程就正常退出。运行结果:从运行结果可以看出父进程PID 993444创建了3个子进程严格按照任务表执行PID 993445和993447执行【Task】PID 993446执行【Hello】三个子进程并发执行交替打印输出说明它们是并发运行的操作系统在调度执行。所有子进程的父进程IDppid都是993444形成了“一父三子”的进程树结构。每个子进程都循环执行了5次任务cnt 从4递减到0符合Task() 和Hello() 的逻辑。所有子进程执行完毕后正常退出退出码为0父进程成功回收无僵尸进程。六、非阻塞轮询waitpid第三个参数optionswaitpid函数的第三个参数options用于指定阻塞方式。当传入0时waitpid会像wait一样让父进程执行阻塞等待。此外还可以传入WNOHANG参数实现非阻塞等待。关于waitpid的返回值成功等待子进程时会返回子进程的PID0如果等待的不是当前进程的子进程则返回-10在非阻塞模式下若子进程状态未改变会返回0在阻塞模式下参数为0或使用wait父进程会一直等待直到子进程状态改变期间会被操作系统置为阻塞状态。而在非阻塞模式下参数为WNOHANG如果子进程状态未改变waitpid会立即返回0允许父进程通过循环实现非阻塞轮询并执行其他任务。需要注意的是在等待间隙执行的任务不宜过重如大文件拷贝应以轻量级任务为主如状态检测或日志打印。我们可以将这些任务封装到函数指针数组中并通过管理函数进行增删查改操作。下面我们通过代码演示一下:运行结果:于是我们就可以观察到我们的父进程一边检测子进程一边做自己的事情即父进程创建子进程实现了非阻塞轮询自己的事情当子进程退出的时候此时waitpid返回等待的子进程的pidid接收waitpid的返回值id 0父进程判断子进程是否出现异常以及结果是否正确并且还可以扩展一下我们在命令行中执行的命令程序这个命令程序就是bash通过fork创建的子进程那么bash就会对这个命令进行阻塞等待并且对于我们执行的其它命令不响应运行结果:在这个运行过程中bash会阻塞等待它的子进程对于用户执行的其它命名将不会响应小编尝试执行诸如lspwd命令都无效即bash对我们的命令不响应当我们想要退出的时候按下ctrl c即可终止退出进程fork了一个子进程,父子谁先运行?不确定,调度器说了算一般父子进程,谁先退出?子进程先退出,然后父进程负责进行资源回收七、总结本文详细讲解了Linux系统中进程等待的重要性与实现方式。主要内容包括进程等待的必要性子进程退出时若未被回收会形成僵尸进程导致内存泄漏父进程必须通过wait/waitpid获取子进程退出状态和资源回收进程等待的实现机制wait函数阻塞等待任意子进程退出waitpid函数更灵活的等待方式可指定子进程PID和等待模式通过status参数获取子进程退出状态正常/异常终止及退出码实际应用场景单子进程和多子进程的回收处理阻塞与非阻塞等待方式的区别父进程在等待期间执行其他任务的轮询机制核心原理操作系统通过位运算在status中编码退出信息进程独立性原则要求必须通过系统调用获取子进程数据父进程对子进程的资源回收责任文章通过代码示例展示了僵尸进程的产生与回收过程以及如何正确使用wait/waitpid系统调用来避免内存泄漏。感谢大家的观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…