欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Linux程序设计 实验报告 大作业.docx

    • 资源ID:61308190       资源大小:1.04MB        全文页数:37页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Linux程序设计 实验报告 大作业.docx

    优质文本实 验 报 告课程名称: LINUX程序设计 学 院: 计算机学院 专 业: 软件工程 班 级: 14-3 姓 名: 张正锟 学 号: 2014010610382017年 1月1日山 东 科 技 大 学 教 务 处 制实 验 报 告组别姓名张正锟同组实验者实验工程名称实验一 熟悉Linux命令实验日期第11周周四9,10节教师评语实验成绩指导教师一、 实验目的熟悉并掌握Linux操作系统根本命令二、 常用的普通命令1. 了解系统的uname,date,w命令2. 了解文件的ls和file命令3. cat,less,head,tail,nl,wc等命令的使用4. 文本内容查找grep 命令5. 文件权限的修改chmod,chown,umask6. 文件夹操作:mkdir,rmdir三、 用户和组的管理管理1. 探究用户配置文件/etc/passwd, /etc/shadow/etc/passwd是用户数据库,其中的域给出了用户名、加密口令和用户的其他信息. /etc/shadow是在安装了影子(shadow)口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow中,而后者只对超级用户( r o o t )可读。这使破译口令更困难,以此增加系统的平安性。2. 探究组配置文件组的配置文件/etc/group, /etc/gshadow3. id, who, whoami,groups等命令四、 文件打包与压缩1. tar压缩和解压五、 软件包管理1. 安装软件tree2. 卸载软件tree六、 进程管理1. top命令动态显示进程状态2. ps命令显示瞬时进程状态3. Kill命令终止一个进程用gedit翻开一个文件a.cpp并在后台运行,显示的进程号为17271,然后用kill命令杀死这个进程,观察到gedit关闭七、 实验总结通过本次实验,熟悉了好多Linux下面的根本命令,可以看出Linux的命令根本上都有好多参数可选,这样就可以用一条命令完成好多任务,大大提高效率。另外还学会了当命令不会使用的时候,可以调用man来查看命令的使用方法。实 验 报 告组别姓名张正锟同组实验者实验工程名称实验二Shell编程实验日期第12周周四9,10节教师评语实验成绩指导教师一、 实验目的Ø 掌握Shell命行的运行Ø 掌握编写和执行Shell程序的步骤Ø 掌握在Shell中使用参数和使用变量的方法Ø 掌握表达式比拟,循环结构语句和条件结构语句的写法Ø 掌握在shell脚本中使用函数的方法二、 简单bash脚本1. 编写bash脚本2. 添加执行权限3. 运行结果三、 计算器:变量读入和输出1. 编辑程序2. 添加可执行权限3. 运行程序四、 比拟两个数字是否相等1. 编写程序2. 添加可执行权限3. 运行程序五、 循环计算累加和1. 编写程序2. 添加可执行权限3. 运行程序六、 利用shell函数计算两数之和1. 编写程序2. 添加可执行权限3. 运行程序七、 计算数组累乘1. 编写程序2. 添加可执行权限3. 运行程序八、 实验总结通过本次实验,我学会了shell中的各种写法,包括流程控制,循环,数组,函数等等,了解到shell在Linux是一种强大的神器,可以批量完成各种操作。实 验 报 告组别姓名张正锟同组实验者实验工程名称实验三文件操作实验日期第13周周四9,10节教师评语实验成绩指导教师一、 实验目标1熟悉cd、date、pwd、cal、who、echo、clear、passwd等常用命令。 2掌握在用户主目录下对文件进行的操作:复制一个文件、显示文件内容、查找指定内容、排序、文件比拟、文件删除等。 3学会对目录进行管理:创立和删除子目录、改变和显示工作目录、列出和更改文件权限、链接文件等。 二、 文件操作:修改文件权限设计一个程序,要求把系统中“/etc目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。1. 编写C语言程序2. 编译执行3. 查看结果三、 从终端读写数据文件的翻开可以用open函数,即使原来的文件不存在,也可以用open函数创立文件。在翻开或者创立文件时,可以指定文件的属性及用户的权限等参数。关闭一个翻开的文件,用close函数。当一个进程终止时,它所有已翻开的文件都由内核自动关闭。1. 编写C语言程序2. 查看运行结果四、文件上锁和锁的释放1. 题目要求设计一个程序,要求在“/root下翻开一个名为“5-11file的文件,如果该文件不存在,那么创立此文件。翻开后对其加上强制性的写入锁F_WRLCK,按回车后解锁F_UNLCK,然后加上读出锁F_RDLCK,按回车后再解锁F_UNLCK。程序在终端1运行后会显示程序的进程号,再翻开终端2,会提示此文件处于锁定状态,此时在终端2可以多按回车,观察程序的运行结果。然后在终端1按回车,等待终端1解锁后,在终端2才可锁定此文件,你可观察到强制性锁是独占状态,当在终端2解锁后,在终端1或2可加读出锁,在读出锁状态终端1或2的运行不需要等待,因为读出锁是处于共享状态,请编写程序并测试程序运行的结果。2. 分析主程序先用open函数翻开文件“5-11file,如果该文件不存在,那么创立此文件;接着调用自定义函数lock_set:先传递参数“F_WRLCK给文件“5-11file加锁,并打印输出给文件加锁进程的进程号,然后先传递参数“F_UNLCK给文件“5-11file解锁,并打印输出给文件解锁进程的进程号;在自定义函数lock_set给文件上锁语句前,加上判断文件是否上锁的语句,如果文件已经被上锁,打印输出给文件上锁进程的进程号。3. 编写C语言程序4. 执行程序终端1:加上写入锁的是: 5403释放强制性锁: 5403文件已加上写入锁,其进程号是: 5404文件已加上写入锁,其进程号是: 5404文件已加上写入锁,其进程号是: 5404加上读取锁的是: 5403释放强制性锁: 5403终端2:文件已加上写入锁,其进程号是: 5403文件已加上写入锁,其进程号是: 5403文件已加上写入锁,其进程号是: 5403加上写入锁的是: 5404释放强制性锁: 5404加上读取锁的是: 5404释放强制性锁: 5404五、 流文件的翻开和关闭带缓存的流文件I/O操作,是基于输入/输出I/O流机制的文件操作,又做文件流的操作。下面具体说明文件流的关闭与翻开。1. 题目要求设计一个程序,要求用流文件I/O操作翻开文件“5-12file, 如果该文件不存在,那么创立此文件。2. 题目分析带缓存的基于输入/输出I/O流机制的文件操作时,翻开文件用fopen函数,关闭文件用fclose函数。3. 程序编写4. 运行结果可以看到程序运行后创立了5-12file文件六、 实验总结通过本次实验,我掌握了Linux下用C语言读写文件的方法,包括带缓存和不带缓存的方法。另外也学会了用C语言修改文件权限等知识点。可以看出Linux和C语言是浑然一体地,可以用C语言无缝地操作Linux系统。实 验 报 告组别姓名张正锟同组实验者实验工程名称实验四进程控制实验日期第14周周四9,10节教师评语实验成绩指导教师一、 实验目标1. 理解进程的根本概念及进程的结构2. 学会Linux环境下进程的相关函数的应用3. 掌握守护进程的概念、启动和建立4. 掌握进程操作程序的编写二、 进程简介进程是正在执行中的程序。当我们在终端执行命令时,Linux 就会建立一个进程,而当我们的程序执行完成时,这个进程就被终止了。Linux是一个多任务操作系统,允许多个用户使用计算机系统,多个进程并发执行。 Linux环境下启动进程有两种主要途径:手工启动和调度启动。三、 程序显示进程号和父进程号在Linux环境下进程创立时,系统会分配一个唯一的数值给每个进程,这个数值就称为进程标识符PID。在Linux中进程标识有进程号PID和它的父进程号PPID。其中,PID唯一地标识一个进程。PID和PPID都是非零的正整数。在Linux中获得当前进程的PID和PPID的系统调用为getpid和getppid函数。1. 程序编写2. 编译运行可看到,每次运行的pid都是不同的。四、 子进程的创立进程调用fork函数创立一个新进程,由fork创立的新进程被称为子进程child process。该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值那么是新子进程的进程PID。子进程和父进程继续执行fork之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间局部,通常父、子进程共享代码段1. 编写C语言程序2. 运行程序五、 进程的退出1. 题目要求设计一个程序,要求子进程和父进程都在显示输出一些文字后分别用exit和_exit函数终止进程。2. 题目分析由于printf函数使用的是缓冲I/O方式,遇到n时自动将数据从缓冲区读出。可以看出,调用exit函数时,缓冲区中的记录能正常输出;而调用_exit时,缓冲区中的记录无法输出。Linux标准函数库中,有一种操作称为“缓冲I/O,每次读写文件时,都是在缓冲区里读取、写入。写入文件时,等满足一定条件才将缓冲区的内容一次性写入文件。但是,有时没有满足选定的条件,数据只存在缓冲区内,如果这时调用_exit函数直接关闭进程,缓冲区中的数据就会丧失。3. 程序编写4. 程序执行可以看到,程序只在父进程进行了输出。这是因为子进程调用了_exit()函数,没有进行缓冲区IO的刷新。六、 实验总结通过本次试验,我了解了Linux的进程机制,学会了根本的进程创立,进程终止,学会了在Linux下用C语言操作进程。了解到了Linux是一个多任务操作系统,允许我们使用计算机系统,多个进程并发执行。实 验 报 告组别姓名张正锟同组实验者实验工程名称实验五线程练习实验日期第15周周四9,10节教师评语实验成绩指导教师一、 实验目的Ø 了解线程的根本概念Ø 掌握线程相关函数及应用Ø 理解线程同步互斥二、 线程概述线程定义为进程内一个执行单元或一个可调度实体。在不拥有线程的进程概念中,进程既是一个拥有资源的独立单位,它可独立分配虚地址空间、主存和其它,又是一个可独立调度和分派的根本单位。在有了线程以后,资源拥有单位称为进程或任务,调度的单位称为线程、又称轻进程Light Weight Process,LWP。多线程的进程在同一地址空间内包括多个不同的控制流,也即属于同一进程下的线程,它们共享进程拥有的资源,如代码、数据、文件等。线程也独占一些资源,如堆栈、程序计数器等。多线程系统的优点包括对用户响应的改良,进程内的资源共享,以及利用多处理器体系结构的便利。从实现的角度看,把线程分为用户级线程和内核级线程。用户级线程对程序员来说是可见的,而对内核来说是未知的,用户空间的线程库通常用以管理用户级线程,线程库提供对线程创立、调度和管理的支持。内核级线程由操作系统支持和管理,在内核空间实现线程创立、调度和管理。用户级线程与内核级线程相比,优点是创立和管理要更快;缺点是得到CPU的时间更少,当一个线程阻塞时,连累其它线程全部阻塞。三、 共享内存变量访问中冲突的现象1. 关于线程同步与互斥当并发执行的线程共享数据时,各线程会改写共享的数据,由于CPU调度顺序的不确定性,造成线程运行结果的不确定性。所以,必须为共享数据的一组相互协作的线程提供互斥。一种思想是确保在任何时刻最多只能有一个线程执行这些访问共享数据的代码。这就是临界区互斥问题。线程在并发执行时为了保证结果的可再现性,各线程执行序列必须加以限制以保证互斥地使用临界资源,相互合作完成任务。多个相关线程在执行次序上的协调称为线程同步。用于保证多个线程在执行次序上的协调关系的相应机制称为线程同步机制。Pthread线程库提供了多种方式来处理线程同步互斥机制,最常用的是互斥锁、条件变量和信号量。2. C语言程序编写3. 程序执行编译并运行程序:结果是10 。我们创立两个线程,counter的初值为0,各自把counter增加10次,正常情况下最后counter应该等于20 四、实验总结通过本次实验,我学会了在Linux下使用C语言操作线程的方法,了解了线程和进程的区别,对于理解Linux的核心非常有帮助。实 验 报 告组别姓名张正锟同组实验者实验工程名称实验六网络编程实验日期第16周周四9,10节教师评语实验成绩指导教师一、 实验目标Ø 理解端口及Socket的根本概念Ø 掌握面向连接的TCP编程Ø 掌握面向非连接的UDP编程Ø 了解/O多路利用的控制Ø 了解复杂网络程序的实现二、 协议概述1. TCP/IP协议TCP/IP协议Transmission Control Protocol/Internet Protocol叫做传输控制/网际协议,又叫网络通信协议。TCP/IP是20世纪70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和协议标准,以它为根底组建的Internet是目前国际上规模最大的计算机网络。正因为Internet的广泛使用,使得TCP/IP成了事实上的标准。TCP/IP虽然叫传输控制协议TCP和网际协议IP,但实际上是一组协议,它包含了上百个功能的协议,如ICMP、RIP、TELNET、ARP、TFTP等,这些协议一起被称为TCP/IP协议。2. UDP和TCP协议TCP与UDP是两种不同的网络传输方式。两个不同计算机中的程序,使用IP地址和端口,要使用一种约定的方法进行数据传输。主要的区别是进行数据传输时是否进行连接。TCP:TCP是一种面向连接的网络传输方式。这种方式可以理解为打 。计算机A先呼叫计算机B,计算机B接受连接后发出确认信息,计算机A收到确认信息以后发送信息,计算机B完成数据接收以后发送完毕信息,这时再关闭数据连接。所以TCP是面向连接的可靠的信息传输方式。这种方式是可靠的,缺点是传输过程复杂,需要占用较多的网络资源。UDP:UDP是一种不面向连接的传输方式。可以简章理解成邮寄信件。将信件封装放入邮筒以后,不再参预邮件的传送过程。使用UDP传送信息时,不建立连接,直接把信息发送到网络上,由网络完成信息的传送。信息传递完成以后也不发送确认信息。这种传输方式是不可靠的,但是有很好的传输效率。对传输可靠性要求不高时,可以选择使用这种传输方式。3. 套接字Socket是网络编程的一种接口,它是一种特殊的I/O。在TCP/IP协议中,“IP地址+TCP或UDP端口号可以唯一标识网络通讯中的一个进程,可以简单地认为:“IP地址+端口号就称为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,这两个socket组成的socket对就唯一标识一个连接。用socket函数建立一个socket连接,此函数返回一个整型的socket描述符,随后进行数据传输。一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket 是面向客户/效劳器模型而设计的。通常,socket分为三种类型:流式socket、数据报socket和原始socket。注意:一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket 是面向客户/效劳器模型而设计的。三、 设计效劳器-客户端通信程序1. 编写效劳端程序#include <netinet/in.h> / for sockaddr_in#include <sys/types.h> / for socket#include <sys/socket.h> / for socket#include <stdio.h> / for printf#include <stdlib.h> / for exit#include <string.h> / for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/#define HELLO_WORLD_SERVER_PORT 6666 #define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define 512 int main(int argc, char *argv) /设置一个socket地址结构server_addr,代表效劳器internet地址, 端口 struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr); /把一段内存区的内容全部设置为0 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); /创立用于internet的流协议(TCP)socket,用server_socket代表效劳器socket int server_socket = socket(PF_INET,SOCK_STREAM,0); if( server_socket < 0) printf("Create Socket Failed!"); exit(1); int opt =1; setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt); /把socket和socket地址结构联系起来 if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr) printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1); /server_socket用于监听 if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) printf("Server Listen Failed!"); exit(1); while (1) /效劳器端要一直运行 /定义客户端的socket地址结构client_addr struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); /接受一个到server_socket代表的socket的一个连接 /如果没有连接请求,就等待到有连接请求-这是accept函数的特性 /accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信 /new_server_socket代表了效劳器和客户端之间的一个通信通道 /accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中 int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0) printf("Server Accept Failed!n"); break; char bufferBUFFER_SIZE; bzero(buffer, BUFFER_SIZE); length = recv(new_server_socket,buffer,BUFFER_SIZE,0); if (length < 0) printf("Server Recieve Data Failed!n"); break; char ; bzero(, ); strncpy(, buffer, strlen(buffer)>(buffer);/ int fp = open(, O_RDONLY);/ if( fp < 0 ) printf("%sn",); FILE * fp = fopen(,"r"); if(NULL = fp ) printf("File:t%s Not Foundn", ); else bzero(buffer, BUFFER_SIZE); int = 0;/ while( ( = read(fp,buffer,BUFFER_SIZE)>0) while( ( = fread(buffer,sizeof(char),BUFFER_SIZE,fp)>0) printf(" = %dn",); /发送buffer中的字符串到new_server_socket,实际是给客户端 if(send(new_server_socket,buffer,)<0) printf("Send File:t%s Failedn", ); break; bzero(buffer, BUFFER_SIZE); / close(fp); fclose(fp); printf("File:t%s Transfer Finishedn",); /关闭与客户端的连接 close(new_server_socket); /关闭监听用的socket close(server_socket); return 0;2. 编写客户端程序#include <netinet/in.h>    / for sockaddr_in#include <sys/types.h>    / for socket#include <sys/socket.h>    / for socket#include <stdio.h>        / for printf#include <stdlib.h>        / for exit#include <string.h>        / for bzero/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>*/ #define HELLO_WORLD_SERVER_PORT    6666 #define BUFFER_SIZE 1024#define 512 int main(int argc, char *argv)    if (argc != 2)            printf("Usage: ./%s ServerIPAddressn",argv0);        exit(1);         /设置一个socket地址结构client_addr,代表客户机internet地址, 端口    struct sockaddr_in client_addr;    bzero(&client_addr,sizeof(client_addr); /把一段内存区的内容全部设置为0    client_addr.sin_family = AF_INET;    /internet协议族    client_addr.sin_addr.s_addr = htons(INADDR_ANY);/INADDR_ANY表示自动获取本机地址    client_addr.sin_port = htons(0);    /0表示让系统自动分配一个空闲端口    /创立用于internet的流协议(TCP)socket,用client_socket代表客户机socket    int client_socket = socket(AF_INET,SOCK_STREAM,0);    if( client_socket < 0)            printf("Create Socket Failed!n");        exit(1);        /把客户机的socket和客户机的socket地址结构联系起来    if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)            printf("Client Bind Port Failed!n");         exit(1);         /设置一个socket地址结构server_addr,代表效劳器的internet地址, 端口    struct sockaddr_in server_addr;    bzero(&server_addr,sizeof(server_addr);    server_addr.sin_family = AF_INET;    if(inet_aton(argv1,&server_addr.sin_addr) = 0) /效劳器的IP地址来自程序的参数            printf("Server IP Address Error!n");        exit(1);        server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);    socklen_t server_addr_length = sizeof(server_addr);    /向效劳器发起连接,连接成功后client_socket代表了客户机和效劳器的一个socket连接    if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)            printf("Can Not Connect To %s!n",argv1);        exit(1);         char ;    bzero(, );    printf("Please Input On Server:t");    scanf("%s", );         char bufferBUFFER_SIZE;    bzero(buffer,BUFFER_SIZE);    strncpy(buffer, , strlen()>BUFFER_SIZE?BUFFER_SIZE:strlen();    /向效劳器发送buffer中的数据    send(client_socket,buffer,BUFFER_SIZE,0); /    int fp = open(, O_WRONLY|O_CREAT);/    if( fp < 0 )    FILE * fp = fopen(,"w");    if(NULL = fp )            printf("File:t%s Can Not Open To Writen", );        exit(1);             /从效劳器接收数据到buffer中    bzero(buffer,BUFFER_SIZE);    int length = 0;    while( length = recv(client_socket,buffer,BUFFER_SIZE,0)            if(length < 0)                    printf("Recieve Data From Server %s Failed!n", argv1);            break;        /        int write_length = write(fp, buffer,length);        int write_length = fwrite(buffer,sizeof(char),length,fp);        if (write_length<length)                    printf("File:t%s Write Failedn", );            break;                bzero(buffer,BUFFER_SIZE);            printf("Recieve File:t %s From Server%s Finishedn", argv1);         close(fp);    /关闭socket    close(client_socket);    return 0;3. 测试结果当同时运行客户端和效劳端程序后,只要在客户端建立一个帐号,双方就可以收发数据了。四、 实验总结通过本次实验,我学会了在Linux操作系统下,设计效劳端和客户端程序的根本方法,了解了socket通信的重要性,同时也复习了在?计算机网络?中学到的TCP、UDP、IP和端口等知识。

    注意事项

    本文(Linux程序设计 实验报告 大作业.docx)为本站会员(z****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开