版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
20XX/XX/XXLinux系统进程间通信(IPC)详解汇报人:XXXCONTENTS目录01
进程间通信概述02
管道通信机制03
include<unistd.h>#include<stdio.h>#include<string.h>intmain(){intpipefd[2];pipe(pipefd);pid_tpid=fork();if(pid==0){//子进程读close(pipefd[1]);charbuf[100];read(pipefd[0],buf,sizeof(buf));printf("子进程收到:%s\\n",buf);}else{//父进程写close(pipefd[0]);constchar*msg="Hellofromparent";write(pipefd[1],msg,strlen(msg)+1);wait(NULL);}return0;}04
信号通信机制CONTENTS目录05
SystemVIPC机制06
套接字通信07
IPC机制对比与选型08
实战案例与最佳实践01进程间通信概述IPC的定义与必要性IPC的定义进程间通信(IPC,Inter-ProcessCommunication)是操作系统提供的机制,允许不同进程交换数据、共享资源、同步操作或传递事件通知,核心是让进程看到同一份系统提供的资源。数据传输需求进程需交换数据,如即时通讯软件中消息发送进程向接收进程传递用户输入,或数据分析进程向展示进程发送计算结果。资源共享需求多个进程需共享资源,如多个视频播放进程共享显卡渲染画面,多个文档编辑进程共享磁盘文件(需同步机制避免错乱)。事件通知需求进程需告知其他进程事件发生,如子进程结束后通知父进程回收资源,监控进程检测到磁盘空间不足时通知写入进程暂停。进程控制需求控制进程需管理目标进程执行,如调试器gdb通过IPC附加到目标进程,设置断点并监控其执行状态。数据传输实现进程间的数据交换,如即时通讯软件中消息发送进程向接收进程传递用户输入的文字,或数据分析进程将计算结果发送给数据展示进程。资源共享使多个进程能够共同访问同一资源,避免资源冗余存储,例如多个视频播放进程共享系统显卡资源渲染画面,或多个文档编辑进程共享同一磁盘文件。通知事件向其他进程发送事件信号以告知特定事件发生,如子进程执行完毕后通知父进程回收资源,或监控进程检测到磁盘空间不足时通知文件写入进程暂停操作。进程控制一个进程对另一个进程的执行流程进行完全控制,如调试器gdb附加到目标进程后,通过IPC机制设置断点、监控其执行状态、拦截异常等。进程通信的核心目的IPC机制的发展历程
01早期Unix阶段:管道与信号的诞生20世纪70年代,Unix系统引入管道(Pipe)作为首个IPC机制,仅支持亲缘进程单向字节流通信;同期信号(Signal)机制出现,用于进程异常事件通知,构成了最基础的进程协作范式。
02SystemVIPC阶段:多进程协同的突破20世纪80年代,AT&T推出SystemV标准,包含消息队列、共享内存、信号量三大机制,首次支持非亲缘进程通信,解决了管道的亲缘限制,但接口复杂且可移植性差。
03POSIXIPC阶段:标准化与跨平台支持20世纪90年代,POSIX标准统一IPC接口,推出消息队列、共享内存、信号量等机制,新增互斥量、条件变量等同步工具,支持跨Unix系统移植,成为现代操作系统主流方案。
04网络IPC阶段:跨主机通信的普及21世纪以来,套接字(Socket)机制突破单机限制,基于TCP/IP协议实现跨网络进程通信,成为分布式系统、客户端-服务器架构的核心技术,如HTTP、FTP等应用均依赖其实现。通信本质:进程共享资源原理
进程独立性与通信挑战进程拥有独立的虚拟地址空间和页表,确保运行独立性,这使得进程间直接数据访问困难,通信需借助中介。
通信核心:共享第三方资源进程间通信本质是让不同进程看到同一份由操作系统提供的共享资源(通常是特定形式的内存空间),通过读写该资源实现数据交互。
共享资源的管理与访问共享资源的创建、使用和释放依赖操作系统提供的系统调用接口,进程通过这些接口访问资源,实现通信目的。02管道通信机制匿名管道(Pipe)核心特性通信范围:仅限亲缘进程匿名管道仅支持具有血缘关系的进程间通信,如父子进程、兄弟进程,通过fork机制继承文件描述符实现共享。数据传输:半双工单向通信管道数据只能单向流动,需创建两个管道实现双向通信;数据遵循FIFO顺序,读取后从缓冲区删除,不支持随机访问。数据格式:面向字节流以无格式字节流形式传输数据,无消息边界,需应用层自定义数据分隔方式(如固定长度、特殊分隔符)。生命周期:随进程退出释放管道为内存级内核缓冲区,不属于文件系统,当所有引用进程终止后,管道资源由内核自动回收。同步机制:自带阻塞特性读端无数据时阻塞等待,写端缓冲区满时阻塞;若写端关闭,读端返回0(EOF);若读端关闭,写端触发SIGPIPE信号。匿名管道创建与使用流程匿名管道创建接口通过pipe()系统调用创建匿名管道,函数原型为intpipe(intpipefd[2]),成功返回0,失败返回-1。pipefd数组用于存储管道的读端(pipefd[0])和写端(pipefd[1])文件描述符。进程创建与文件描述符继承父进程调用fork()创建子进程,子进程会复制父进程的文件描述符表,从而与父进程共享同一管道。此时父子进程均持有管道的读写端文件描述符。管道通信信道构建为实现单向通信,需关闭父子进程中不需要的端口:父进程关闭读端(close(pipefd[0])),子进程关闭写端(close(pipefd[1])),形成父写子读的单向信道;反之亦然。数据读写操作父进程通过write(pipefd[1],buf,len)向管道写入数据,子进程通过read(pipefd[0],buf,sizeof(buf))从管道读取数据。数据遵循FIFO原则,读取后从管道缓冲区移除。资源释放与进程同步通信完成后,关闭管道读写端(close(pipefd[0])、close(pipefd[1])),父进程通过waitpid()等待子进程结束,确保资源正确回收。匿名管道代码示例:父子进程通信
代码实现步骤1.调用pipe()创建管道,获取读端(pipefd[0])和写端(pipefd[1])文件描述符;2.使用fork()创建子进程;3.父进程关闭读端,子进程关闭写端,建立单向通信信道;4.父进程写入数据,子进程读取数据;5.通信完成后关闭文件描述符。
核心代码片段单击此处添加项正文03include<unistd.h>#include<stdio.h>#include<string.h>intmain(){intpipefd[2];pipe(pipefd);pid_tpid=fork();if(pid==0){//子进程读close(pipefd[1]);charbuf[100];read(pipefd[0],buf,sizeof(buf));printf("子进程收到:%s\\n",buf);}else{//父进程写close(pipefd[0]);constchar*msg="Hellofromparent";write(pipefd[1],msg,strlen(msg)+1);wait(NULL);}return0;}核心特性:突破亲缘限制命名管道通过文件系统路径(如/tmp/myfifo)标识,支持无亲缘关系进程通信,数据存储于内核缓冲区,进程退出后需手动删除文件节点。半双工通信与阻塞机制数据单向流动,支持read/write系统调用;默认以阻塞方式打开,读端需等待写端打开,写端需等待读端打开,可通过O_NONBLOCK标志设置非阻塞模式。创建与删除接口通过mkfifo(constchar*pathname,mode_tmode)创建,权限通常设为0666;使用unlink(pathname)删除文件节点,释放内核资源。典型应用场景适用于单机无关进程通信,如日志收集(tail-fapp.log>log_pipe)、命令行工具协作(mkfifomypipe;echo"data">mypipe)等轻量级数据交互场景。命名管道(FIFO)特性与应用命名管道创建与跨进程通信示例
命名管道创建方式通过mkfifo函数创建,需指定路径名和权限,例如:mkfifo("/tmp/myfifo",0666)。也可使用命令行mkfifomyPipe直接创建。
写进程实现打开FIFO文件(O_WRONLY),写入数据后关闭。示例代码:intfd=open("/tmp/myfifo",O_WRONLY);write(fd,"消息内容",strlen("消息内容")+1);close(fd);
读进程实现打开FIFO文件(O_RDONLY),读取数据并输出。示例代码:intfd=open("/tmp/myfifo",O_RDONLY);read(fd,buf,sizeof(buf));printf("收到:%s",buf);close(fd);
编译运行方式终端1:gccfifo_read.c-ofifo_read&&./fifo_read;终端2:gccfifo_write.c-ofifo_write&&./fifo_write。读端需先运行等待写端。管道读写规则与异常处理读端操作规则读端存在且管道有数据时,read返回实际读取字节数;管道为空时,read阻塞等待数据写入。读端存在但写端关闭时,read返回0(类似文件结束)。写端操作规则写端存在且管道未满时,write返回实际写入字节数;管道满时,write阻塞等待空间释放。写端存在但读端关闭时,write触发SIGPIPE信号,导致进程终止。原子性写入保障当写入数据量≤PIPE_BUF(通常4KB)时,Linux保证写入原子性;超过时不保证,可能被拆分写入。异常处理机制通过fcntl设置O_NONBLOCK标志可将管道设为非阻塞模式,此时读写操作不会阻塞,失败时返回-1并设置errno(如EAGAIN)。04信号通信机制信号的概念与异步通信特点
信号的本质:软件中断机制信号是Linux系统中一种异步通信方式,通过内核向进程发送特定事件通知,本质是对硬件中断的软件模拟,用于实现进程间的事件提醒。
信号的异步通信特性信号的发送和处理具有异步性,接收进程无需主动等待,可在任意时刻被中断并执行预设处理函数,如用户按下Ctrl+C触发SIGINT信号终止进程。
信号的有限数据传递能力信号仅能传递信号类型(如SIGKILL、SIGUSR1),无法携带大量数据,主要用于事件通知而非数据传输,是轻量级的进程间通信手段。
信号的标准处理方式每个信号有默认处理行为(终止、忽略、暂停等),也可通过signal()或sigaction()自定义处理函数,但SIGKILL和SIGSTOP信号不可被捕获或忽略。常用信号类型与默认行为
终止类信号SIGINT(2):用户按下Ctrl+C触发,默认终止进程;SIGKILL(9):强制终止信号,不可捕获或忽略;SIGTERM(15):默认终止信号,可被捕获用于资源清理。
暂停与恢复类信号SIGTSTP(20):用户按下Ctrl+Z触发,默认暂停进程;SIGCONT(18):恢复被暂停进程的执行,默认行为为继续运行。
进程通信相关信号SIGPIPE(13):向无读端的管道写入数据时触发,默认终止进程;SIGCHLD(17):子进程状态改变时通知父进程,默认忽略。
定时器与异常信号SIGALRM(14):alarm()函数设置的定时器到期时触发,默认终止进程;SIGSEGV(11):内存访问越界时触发,默认终止并生成核心转储文件。信号处理函数注册与使用
signal函数:基础注册接口signal函数原型:sighandler_tsignal(intsignum,sighandler_thandler)。参数signum为信号编号,handler为处理函数指针,可设为SIG_DFL(默认)、SIG_IGN(忽略)或自定义函数。成功返回原处理函数地址,失败返回SIG_ERR。
sigaction函数:高级注册接口sigaction函数提供更精细控制,支持设置信号掩码、获取信号信息。通过structsigaction结构体指定处理函数(sa_handler)、信号掩码(sa_mask)及标志(sa_flags),如SA_RESTART可自动重启被中断的系统调用。
自定义信号处理函数示例示例:voidhandle_sigusr1(intsigno){printf("收到SIGUSR1信号\\n");}。注册方式:signal(SIGUSR1,handle_sigusr1);或通过sigaction结构体配置,实现信号的自定义响应逻辑。
信号发送与等待函数kill(pid_tpid,intsig)向指定进程发送信号;pause()阻塞等待任意信号。示例:子进程通过kill(getppid(),SIGUSR1)向父进程发送信号,父进程用pause()等待并触发处理函数。信号发送与捕获代码示例
01信号捕获进程实现通过signal()函数注册SIGUSR1信号的自定义处理函数handle_sigusr1,进程暂停等待信号。核心代码:signal(SIGUSR1,handle_sigusr1);while(1)pause();
02信号发送进程实现使用kill()函数向目标进程发送SIGUSR1信号,需传入目标进程PID作为参数。核心代码:kill(pid,SIGUSR1);其中pid通过命令行参数获取。
03编译运行步骤终端1编译运行接收进程:gccsignal_recv.c-osignal_recv&&./signal_recv;终端2编译运行发送进程:gccsignal_send.c-osignal_send&&./signal_send05SystemVIPC机制消息队列:结构化消息传递核心原理:内核维护的消息链表
消息队列是存放在内核中的消息链表,每个消息包含类型字段和数据部分,进程可按类型选择性读取消息,实现异步通信。关键特性:独立于进程的生命周期
消息队列由内核管理,进程退出后消息仍可保留,需通过msgctl显式删除;支持无亲缘关系进程通信,消息按类型标识实现优先级处理。核心API与操作流程
通过msgget创建/获取队列,msgsnd发送消息,msgrcv接收消息(按类型筛选),msgctl进行删除等控制操作,典型key值通过ftok生成。代码示例:父子进程消息传递
子进程填充消息结构体(mtype=1,mtext=消息内容),调用msgsnd发送;父进程通过msgrcv指定类型1接收,最后用msgctl(IPC_RMID)清理队列。适用场景与局限性
适用于异步任务调度、日志收集等需分类传递数据的场景;但存在内核缓冲区大小限制,且数据需两次拷贝(用户→内核→用户),效率低于共享内存。消息队列函数接口与代码示例核心函数接口消息队列主要涉及四个核心函数:msgget()用于创建或获取消息队列,msgsnd()用于发送消息,msgrcv()用于接收消息,msgctl()用于控制消息队列(如删除)。msgget()函数函数原型:intmsgget(key_tkey,intshmflg)。功能:创建或获取消息队列。参数key为键值,shmflg为权限标志(如IPC_CREAT|0666表示创建队列并设置权限)。成功返回消息队列ID,失败返回-1。msgsnd()与msgrcv()函数msgsnd()原型:intmsgsnd(intmsgid,constvoid*msgp,size_tmsgsz,intmsgflg),用于发送消息,msgp指向消息结构体,msgsz为消息数据长度。msgrcv()原型:ssize_tmsgrcv(intmsgid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg),用于接收消息,msgtyp指定消息类型。消息发送示例代码发送进程通过msgget()获取队列ID,填充消息结构体(包含mtype和mtext),调用msgsnd()发送消息。示例代码片段:structmsgbuf{longmtype;charmtext[100];};intmsgid=msgget((key_t)1234,0666|IPC_CREAT);msgsnd(msgid,&msg,sizeof(msg.mtext),0);消息接收示例代码接收进程通过msgget()获取同一队列ID,调用msgrcv()按类型接收消息,处理后调用msgctl(msgid,IPC_RMID,NULL)删除队列。示例代码片段:msgrcv(msgid,&msg,sizeof(msg.mtext),1,0);printf("收到消息:%s\n",msg.mtext);共享内存:高效数据共享
核心原理:零拷贝机制共享内存是最快的IPC方式,通过内核开辟物理内存,多个进程将其映射到各自虚拟地址空间,直接读写内存,无需数据拷贝,避免了管道/消息队列的用户-内核空间数据传输开销。
关键特性与限制特性:支持任意进程通信、数据实时共享、无数据大小限制(受系统内存限制)。限制:不自带同步机制,需配合信号量等解决并发冲突;生命周期需手动管理,进程退出后内存不会自动释放。
SystemV共享内存核心函数shmget():创建或获取共享内存段,需指定key值和大小;shmat():将共享内存附加到进程地址空间;shmdt():分离共享内存;shmctl():控制共享内存(如删除)。
典型应用场景适用于大数据量、高实时性场景,如实时数据采集(传感器数据共享)、数据库缓存、图像处理等。例如:多个进程同时访问共享图像数据进行并行处理,效率远超管道。共享内存创建与映射代码示例
创建共享内存段使用shmget函数创建共享内存,需指定key值、大小和权限。示例代码:intshmid=shmget((key_t)1234,1024,0666|IPC_CREAT);其中1234为key值,1024为内存大小(字节),0666为权限。
将共享内存映射到进程地址空间通过shmat函数将共享内存附加到进程地址空间。示例代码:char*shmaddr=(char*)shmat(shmid,NULL,0);成功返回映射后的内存首地址,失败返回-1。
向共享内存写入数据直接对映射后的地址进行写操作。示例代码:strcpy(shmaddr,"Hellofromsharedmemory");无需系统调用,直接操作内存,效率高。
从共享内存读取数据通过映射地址直接读取数据。示例代码:printf("Sharedmemorycontent:%s",shmaddr);读取后数据仍保留在共享内存中,需手动同步。
分离与删除共享内存使用shmdt分离映射:shmdt(shmaddr);调用shmctl删除共享内存:shmctl(shmid,IPC_RMID,NULL);确保资源释放,避免内存泄漏。信号量的核心概念信号量是内核维护的计数器,用于控制多个进程对共享资源的访问,实现进程间的同步与互斥。其核心操作是P(申请资源,信号量减1)和V(释放资源,信号量加1)原语,操作具有原子性。信号量的类型与作用分为二值信号量(值为0或1,用于互斥,如控制共享内存的独占访问)和计数信号量(值为非负整数,用于控制资源数量,如限制同时访问的进程数)。SystemV信号量核心函数包括semget(创建或获取信号量集)、semop(执行P/V操作)、semctl(控制信号量,如设置值、删除)。例如,通过semget创建key为1234的信号量集,初始值设为1实现互斥。典型应用场景常与共享内存配合使用,防止多个进程同时读写共享内存导致数据竞争。例如,进程访问共享内存前执行P操作获取信号量,访问完成后执行V操作释放信号量。信号量:进程同步与互斥信号量P/V操作与代码示例
P操作(资源申请)信号量值减1,若结果小于0则进程阻塞等待。核心功能是申请临界资源访问权限,确保资源独占或按计数分配。
V操作(资源释放)信号量值加1,若结果大于等于0则唤醒阻塞进程。核心功能是释放临界资源,允许其他进程继续访问。
二值信号量代码示例初始化信号量值为1(互斥锁),子进程执行P操作后进入临界区,完成后执行V操作释放资源,父进程同步等待并操作。06套接字通信Socket通信机制概述Socket是一种通用的进程间通信机制,既支持同一主机内进程通信,也支持跨网络主机间通信。它基于TCP/IP协议栈,通过IP地址和端口号定位目标进程,提供流式(TCP)和数据报(UDP)两种通信模式。本地Socket的核心优势本地Socket(UnixDomainSocket)通过文件系统路径标识,避免网络协议栈开销,通信效率高于网络Socket。支持面向连接(SOCK_STREAM)和无连接(SOCK_DGRAM)模式,适用于单机高并发进程通信。本地Socket通信示例服务端通过socket()创建套接字,bind()绑定本地路径(如/tmp/socket),listen()监听连接,accept()接收客户端请求;客户端通过socket()创建套接字后connect()连接服务端,双方通过read()/write()交换数据。典型应用场景本地Socket广泛应用于数据库服务(如MySQL本地连接)、进程间控制(如Dockerdaemon通信)、日志收集系统等场景,尤其适合对通信效率和安全性要求较高的单机进程协作。Socket概述与本地通信应用UnixDomainSocket代码示例服务器端实现创建本地套接字,绑定文件路径,监听连接请求,接受客户端连接并读取数据。关键函数:socket(AF_UNIX,SOCK_STREAM,0)、bind()、listen()、accept()。客户端实现创建本地套接字,连接服务器端的套接字文件,发送数据。关键函数:socket(AF_UNIX,SOCK_STREAM,0)、connect()、write()。编译与运行步骤服务器端:gccserver.c-oserver&&./server;客户端:gccclient.c-oclient&&./client。注意运行前确保套接字文件路径可访问,通信完成后删除套接字文件。07IPC机制对比与选型通信性能对比:吞吐量与延迟
01共享内存:吞吐量之王共享内存通过直接映射物理内存实现零数据拷贝,吞吐量可达GB级,适用于大数据量实时传输场景,如视频处理、数据库缓存。
02管道/命名管道:低延迟字节流基于内核缓冲区的半双工通信,延迟通常在微秒级,吞吐量受缓冲区大小限制(默认64KB),适合Shell命令交互、日志传输等轻量场景。
03消息队列:结构化数据平衡之选支持按类型读取的内核级链表,单条消息延迟约10-100微秒,吞吐量中等,适用于异步任务调度、日志分类等需消息优先级的场景。
04信号量:同步开销需考量作为同步工具,本身不传输数据,P/V操作延迟约1-10微秒,常与共享内存搭配使用,确保临界资源安全访问。
05Socket:跨网络场景的权衡本地Socket(UnixDomainSocket)延迟约10-50微秒,网络Socket受协议栈影响延迟更高(毫秒级),适用于跨主机通信如客户端-服务端架构。适用场景分析:数据量与同步需求
小数据量单向通信场景适用于管道(Pipe)和命名管道(FIFO),如Shell命令管道(ls|grep)、父子进程简单数据传递,特点是实现简单但数据量有限(通常几KB至64KB)。
异步事件通知场景适用于信号(Signal),如进程异常终止通知(SIGINT)、子进程状态变更(SIGCHLD),仅传递事件类型,无数据载荷,响应速度快。
结构化消息传递场景适用于消息队列(MessageQueue),如日志收集系统、异步任务调度,支持按类型筛选消息,数据持久化至内核,适合非实时多进程通信。
大数据量高速传输场景适用于共享内存(SharedMemory),如图像处理、数据库缓存,直接映射物理内存,零数据拷贝,需配合信号量实现同步互斥。
跨主机通信场景适用于套接字(Socket),如客户端-服务器架构、分布式系统,支持TCP(可靠)/UDP(快速)协议,可在不同主机间传输任意数据量。生产者-消费者模型通过缓冲区实现生产与消费解耦,生产者向缓冲区写入数据,消费者从缓冲区读取数据,需信号量控制同步与互斥,适用于数据生成与处理速度不匹配场景。客户端-服务器模型客户端发起请求,服务器响应处理,基于命名管道或Socket实现通信,客户端可并发访问,服务器需处理连接管理与资源分配,广泛应用于网络服务与分布式系统。读写模型多个读进程可同时访问共享资源,写进程需独占访问,通过读写锁或信号量实现,读多写少场景下提升效率,如数据库查询与更新操作。进程池模型预先创建固定数量子进程处理任务,主进程通过管道分发任务,避免频繁创建销毁进程开销,适用于高并发短任务场景,如Web服务器请求处理。多进程协作经典模型08实战案
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福州软件职业技术学院《环境与自然资源经济学》2025-2026学年期末试卷
- 民办合肥滨湖职业技术学院《会展战略管理》2025-2026学年期末试卷
- 福州软件职业技术学院《婚姻家庭法》2025-2026学年期末试卷
- 有色矿石磨细工复试评优考核试卷含答案
- 实验动物养殖员安全专项知识考核试卷含答案
- 搪瓷瓷釉制作工操作评估知识考核试卷含答案
- 客运索道操作工班组安全模拟考核试卷含答案
- 初级会计职称预测卷中等及答案
- 材料科学结业考试重点难点试题及答案
- 《工程建设环境与安全管理》课件 项目3、4 建设项目环境管理制度、建设工程施工环境管理措施
- 政治湖北十一校2026届高三年级第二次联考(3.25-3.26)
- 2026江西赣州市政公用集团社会招聘39人备考题库及参考答案详解ab卷
- 2026年广东省广轻控股集团有限公司校园招聘笔试模拟试题及答案解析
- 快递员服务规范与操作流程(标准版)
- 二类医疗器械经营质量管理制度及工作程序
- 湖南省2026届高三九校联盟第二次联考语文试卷(含答案详解)
- 汽轮机润滑油系统课件
- 2026年高考数学二轮复习专题13 椭圆、双曲线与抛物线(复习讲义)(解析版)
- 南瑞集团在线测评试题
- 管道支架施工专项措施
- 设计院安全生产管理制度
评论
0/150
提交评论