admin 管理员组文章数量: 1184232
2023年12月23日发(作者:织梦网站管理)
实验课题
1:Linux
命令解释程序设计与实现
实验报告
1
实验内容及要求
Linux 命令解释程序功能设计要求:
1) 选取和设计实现一组内部命令(五条以上) ;
2) 外部命令执行采用直接调用 exec 系统调用的方式来实现;
3) 至少一条内部命令采用直接调用相应系统调用的方式来实现;
4) 系统环境变量(至少包括当前目录)支持;
5) 在 Linux 操作系统上启用(或替换原命令解释程序 Shell )测试验 证。
2
开发、运行及测试环境
1) 虚拟环境软件 : Oracle VM VirtualBox
2) 操作系统: Oracle Linux 6.5
3) 编辑器: vim
4) 编译器: gcc
3
实验步骤
采用 c 语言编写该 Linux 命令解释程序。首先包含 unistd.h 、
sys/syscall.h 等头文件以及完成各个功能的函数声明。主程序中利用循环结 构完成不限次的命令提示符显示和命令输入,并判别输入的命令是否合法,是 内部命令还是外部命令。将 Linux 命令解释程序的各个功能封装成函数,完成 具体的命令执行处理。实现具体功能步骤如下。
3.1
采用间接调用实现的内部命令
3.1.1 显示指定目录下文件列表
设计该命令关键词为“ ls ”, 功能为用户输入该命令后,指定具体的目录路
径,可显示在该目录下的文件列表,并将文件编号显示,格式为“ file 编号 文件名”,每行显示一个文件的文件名。如该过程中出现错误导致不能显示文件 列表则输出具体错误提示。采用间接调用相应系统调用的方式将该功能完成后 封装为 void
list_() 函数。
3.1.2 显示当前路径
设计该命令关键词为“ pwd”, 功能为用户输入该命令后,在下一行显示当 前路径并回车换行。采用间接调用相应系统调用的方式将该功能完成后封装为 void
pwd_() 函数。
设计该命令关键词为“ rename”, 功能为用户输入该命令后,在下一行显示
3.1.3 文件重命名
1
“ pleace input the old file name: ”,用户需输入需要重命名的文件名,然
后显示“ pleace input the new file name: ”,用户需输入该文件的新的文件
名,即可完成对文件的重命名。完成后显示提示重命名工作失败或成功。采用 间接调用相应系统调用的方式将该功能完成后封装为 void rename_() 函数。
3.1.4 显示输入内容
设计该命令关键词为“ echo” , 功能为用户输入该命令后,输入空格,然后
输入需要显示的内容,即可在下一行显示上述用户希望输出的内容并回车换 行。采用间接调用相应系统调用的方式将该功能完成后封装为 void echo_() 函 数。
3.1.5 使用帮助
设计该命令关键词为“ help ” , 功能为用户输入该命令后,然后显示本命令
解释程序的合法命令及其具体的功能说明。采用间接调用相应系统调用的方式 将该功能完成后封装为 void help_() 函数。
3.1.6 退出程序
设计该命令关键词为“ exit ”或“ quit ”, 功能为用户输入该命令后,显示
“ thank you for using! bye~ ”,之后该命令解释程序( Shell )退出到 Linux
操作系统上的原命令解释程序 Shell 。采用间接调用相应系统调用的方式完 成。因该功能代码较简单直接在主程序中实现并未封装为函数。
3.1.7 设置和初始化系统环境变量
此处略,详见下文 3.4 系统环境变量支持中的说明。
3.2
采用直接调用的内部命令
3.2.1 文件拷贝
设计该命令关键词为“ copy” , 功能为用户输入该命令后,然后显示
“ pleace input the file name to be copied: ”,用户输入需要复制的文件的
文件名,然后显示“ pleace input the new file name: ”,用户输入新拷贝文
件的文件名,即可完成文件的拷贝。如该过程中出现错误导致文件拷贝不成功 则输出具体错误提示。采用直接调用系统调用的方式将该功能完成后封装为 void
copy_() 函数。
3.3
外部命令
3.3.1 显示环境变量
设计该命令关键词为“ env”, 功能为用户输入该命令后,然后显示出所有 的系统环境变量,每行显示一个。采用直接调用 exec 系统调用的方式将该功 能完成后封装为 int environ_() 函数。3.3.2 显示当前一系列进程
2
设计该命令关键词为“ jobs ”, 功能为用户输入该命令后,然后显示出当前
一系列进程和子进程。采用直接调用 exec 系统调用的方式将该功能完成后封 装为
int jobs_() 函数。
3.4
系统环境变量支持
设计该命令关键词为“ export ”, 功能为用户输入该命令后,输入需要设置
的系统变量名称和变量值,格式为“ [系统变量名称 ]=[ 系统变量值] ”然后即可
设置完成。采用间接调用相应系统调用的方式分别实现保存在本地用户变量中 和保存在系统环境变量种,并分别封装为 void env_store() 和 void env_export() 函数。最后将上述功能函数完成后封装为 void export_() 函数。
以上代码编写完成后,通过 Linux 操作系统中的 gcc 编译器编译后运行, 验证是否运行成功,功能是否完善,是否存在错误或问题。返回上述步骤修改 代码,直到测试验证通过。
4
关键数据结构和算法流程
在主程序中的关键数据结构是字符数组,用于接收用户输入的命令。关键 的算法结构是循环结构,利用死循环结构用户可以不限次输入命令供程序执行 处理,直到用户输入退出的命令则退出该循环结构,程序退出。
在循环结构中,输出系统命令提示符,提示用户输入。用户输入命令存入 字符串数组后,将该命令与预设的命令依次比较是否符合某一个,则进入相应 命令的处理过程。若均不符合则输出输入错误的提示,继续回到循环开头输出 系统命令提示符等待下一次输入命令。
4.1
采用间接调用实现的内部命令
4.1.1 显示指定目录下文件列表 关键数据结构是另一字符数组,用于接收用户在命令后输入的指定目录; 结构体“ struct dirent *entry ”, 用于存储该目录下文件,包括文件名;变量 DIR *olist 用于存储打开目录函数的返回值,判别是否打开成功并读取该目录 下文件。
该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令和指定路径后,调用 opendir() 函数打开指定的目录。若返回值为空则打开 失败,输出错误提示。利用循环结构调用 readdir() 函数读取该目录下文件, 并依次输出文件序号和文件名。循环结束后,调用 closedir() 函数关闭该目 录。若关闭失败则输出错误提示。
4.1.2 显示当前路径 关键数据结构为字符型指针,用于指向当前路径。 该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命
令后,调用 getcwd() 函数获取当前路径,由指针指向该空间,然后输出该路 径。最后释放该指针空间。
关键数据结构为两个字符型数组,用于存储新文件名和旧文件名。 该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令后,分别输入旧文件名和新文件名存入数组。调用 rename() 函数,将文件重 命名。最后输出命名成4.1.3 文件重命名
3
功或失败的提示。
4.1.4 显示输入内容
关键数据结构为字符型数组,用于存储用户除命令外输入的内容。 该命令无需调用系统调用。关键算法是用户输入该命令后,将命令后的内 容除空格外依次输出,最后输出换行即可。
4.1.5 使用帮助
在该函数中输出定义好的命令和相应使用帮助即可。
4.1.6 退出程序
输出用户提示,调用函数 exit() 退出程序即可。
4.1.7 设置和初始化系统环境变量
此处略,详见下文 4.4 系统环境变量支持中的说明。
4.2
采用直接调用的内部命令
4.2.1 文件拷贝
关键数据结构为三个字符型数组,用于存储需拷贝的文件的文件名和拷贝 文件的文件名以及拷贝的部分文件内容。
该命令是直接调用相应的系统调用实现的方式。关键算法是用户输入该命 令以及需拷贝的文件的文件名和拷贝文件的文件名后,使用 syscall() 函数和 系统调用号 SYS_open,采用只读模式打开需要拷贝的文件,若打开失败输出相 应提示。使用
syscall() 函数和系统调用号 SYS_read,读取该文件的内容和字 节数量,若读取失败输出相应提示。使用 syscall() 函数和系统调用号 SYS_creat,采用读写模式创建拷贝的新文件,若创建失败输出相应提示。使用 syscall() 函数和系统调用号
SYS_write ,向新文件中写入读取的内容,若写入 失败输出相应提示。使用
syscall() 函数和系统调用号 SYS_close,分别关闭两 个文件,若关闭失败则分别输出相应提示。若以上步骤均成功则最后输出相应 拷贝成功提示。
4.3
外部命令
4.3.1 显示环境变量
该命令是采用直接调用 exec 系统调用实现的方式。调用 fork() 函数生成 子进程并返回 pid ,根据该值判断。如果出现错误, fork 返回一个负值,此时 打印错误信息并返回;在子进程中, fork 返回 0,此时调用 execlp() 命令参数 为“ env”, 即可显示所有的系统环境变量;在父进程中, fork 返回新创建子进 程的进程 ID,需调用 wait() 函数等待。该命令是采用直接调用 exec 系统调用实现的方式。调用 fork() 函数生成 子进程并返回 pid ,根据该值判断。如果出现错误, fork 返回一个负值,此时 打印错误信息并返回;在子进程中, fork 返回 0,此时调用 execlp() 命令参数 为“ pstree -p ”, 即可以树状图显示一系列子进程;在父进程中, fork 返回新 创4.3.2 显示当前一系列进程
4
建子进程的进程 ID,需调用 wait() 函数等待。
4.4
系统环境变量支持
关键数据结构为自定义的结构体,结构体内为两字符型数组,分别用于存 储系统环境变量的名称和变量的值。
该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令后和系统环境变量的设置后,调用 setenv () 函数设置该环境变量并设置为 可复写的,方便后续修改该变量的值。
同时,附加在本地变量中也保存了上述设置的系统环境变量。在存储变量 的数组中保存上述系统环境变量即可。
5
编译运行测试结果
编译运行自行实现的命令解释程序 shell.o ,显示出命令输入提示符 Qin>”,提示用户输入命令,如图 1 所示。
图1
5.1
采用间接调用实现的内部命令
5.1.1 显示指定目录下文件列表
用户输入命令 ls 后,指定具体的目录路径,可显示在该目录下的文件列 表,并将文件编号显示,格式为“ file 编号: 文件名”,每行显示一个文件的 文件名,如图 2 所示。5
图2
5.1.2 显示当前路径
用户输入命令 pwd后,在下一行显示当前路径并回车换行。如图 3 所示。
图3
5.1.3 文件重命名
用户输入该命令 rename后,在下一行显示“ pleace input the old file
name:”,用户需输入需要重命名的文件名,然后显示“ pleace input the new
file name: ”,用户需输入该文件的新的文件名,即可完成对文件的重命名并显
示成功提示。再次输出该目录下文件,可见文件已经重命名,如图 4 所示。
6
图4
5.1.4 显示输入内容
用户输入该命令 echo 后,输入空格,然后输入需要显示的内容,即可在下
一行显示上述用户希望输出的内容并回车换行。如图 5 所示。
5.1.5 使用帮助
用户输入该命令 help
功能说明。如图 6 所示。
图5
后,然后显示本命令解释程序的合法命令及其具体的
7
图6
5.1.6 退出程序
用户输入该命令 exit/quit 后,显示“ thank you for using! bye~ ”,之
后该命令解释程序( Shell )退出到 Linux 操作系统上的原命令解释程序
Shell 。如图 7 所示。
图7
5.1.7 设置和初始化系统环境变量
此处略,详见下文 5.4 系统环境变量支持中的说明
5.2
采用直接调用的内部命令
5.2.1 文件拷贝
用户输入该命令 copy 后,然后显示“ pleace input the file name to be
copied: ”,用户输入需要复制的文件的文件名,然后显示“ pleace input the
new file name: ”,用户输入新拷贝文件的文件名,即可完成文件的拷贝。再次
输出该目录下文件,可见文件已经被拷贝,如图 8 所示。8
外部命令
显示环境变量
用户输入该命令 environ 后,然后显示出所有的系统环境变量,每行显示 9 所示。
图8
图9
9
5.3
5.3.1
一个。部分输出结果如图
5.3.2 显示当前一系列进程 用户输入该命令后,然后显示出当前一系列进程和子进程。部分输出结果
如图 10 所示。
图
10
5.4
系统环境变量支持
用户输入该命令 export 后,然后输入需要设置的系统环境变量和变量值, 格式为:“ [ 系统变量名称 ]=[ 系统变量值 ] ”,若该系统环境变量没有设置过,则 初始化该变量完成。例如下例中初始化某系统环境变量为“ test=9999 ”。初始 化完成后,使用“ env”命令查看结果,系统环境变量已经初始化,输出结果如
图 11 所示。
若该系统环境变量为曾经设置过,则修改该变量完成。例如下例中设置系 统环境变量为“ test=998 ”。设置完成后,使用“ env”命令查看结果,系统环 境变量已经重新设置,输出结果如图 12 所示。10
HwvtofLE550PEhr
2、sLdkuwr*bltvSGHICONZECTICN■nlp一uh」r>盅nftAMfnp•ul
H
r>16p1.
严s
・5h一
J
館鎳•#
3
②GJBROKE193096El
」厂
17281251FTlgr*E68
厂・EMA
一盂壁e
LOGWAMEAQCII:HOME<5HLC<=5SH_A$K r■二s:lr
7甲厂5Qns呂穿/二.*u
l/ldQTD「厂
合H d«
FrHz
rfl0mm
n・1Pmu«trviibt4K4IL<.-Qgn=CQ5';37:44N丄
不IcQTLIHHAJSr'IihMtQTg' 、£w?fw•亍Q d节T・A5LAluG-enlusNTFLpwmp v£os吐賈・>0 QT3.3r3s o・u;丁r:NT>503・0OLd上Vs r T'^jb/r T U1U」1 上 o3・r、n:vMr%w^5H 、、 ml35:2d-二/FCOLOWSMrTFdFtm^lnMDr « s卑+:P ;';3eHbE 一 r0 、 /0.f$・Kbmol・M ・H&TcohJTROL1二聶严 =・32Q 、mQ1!: O';「占Q总JH ;O,莒i1口ptT』 c g1Q3工 ・ 箱 £ g3」bamx-r7!T吕wE八7rw gnD&dup5 鼻 A-03*上 vt・l戸 5村31;孟、sr世5 • m 4'弋• 亠 z、3^s®6+;rr3G:';m5?o■右opude tr. 兀;-k3r!7.*・- n. ml拾-fl sul n w=44x2molopn诂 &.*xB.汙t^占 ■s-;・xrpo忙gL舀百fs Ue・・ N A・02uJM!?snQMsg-r-rh Ep:J,QgK"01:331;*7TOQr l o3 x 5t GHELL^ff-jrvbashterHOS«- n乔 VMxtmrmTNAMEn ftl HI5T5IET1000 *H b3Ie^J l/l OV-sLrt rtftErtMgga 0IrfG1BR0KEN42SlAL〔oX :K'7^3J壬LJO^e严』SH"QTLTBU>HOME HQTDBtlirJer3a1 b 6誥冷「Q i?・占w/'e3TI—I・fSHELLPs、 gnF-W-s'OT*l.一4zVM 丁 =rr ls 严劭 SH_A3KPASS=0usUUMmb64=Cr爲f lx :N“八gTTY*/d>5pTERM-3E lbJl『n J=o nl ¥、-4 F黑□O XH7&f 刍 gH 4厂 T *-?r『qt^厂 fdLENH_CON> fU—1一HH・l一 ・0 霑/pJw ・eT3 孟OO总u卅b6boHI P7Oi=4* 1-・03R Gs n 十G 二址乂Hdu F・— D^!?当"Jn::,議4 STS ES二Mr-u忙,c^ o7Sr占 M A «、A 5洽 b^血7・ /1M 】 LESSOPENJLAtwr^-in'iessp-ipFEmNulg^leb *;*-mo w±忙41TTL 益・u>3* -nn「 +mM52■roomg:J?冒« rttlMbNIc UW^二 严 审g*cc./apg5Mlvgnwnelssll:34/qp 3E;iuseshtoMTNA uslvloca ;0n:a由0+^» o-hr K1 r .2U甜1 ?ln-ro3gg苍3 ; 肯rr?ri-t h125LO—PWDQa u734 ・耳r ^1?rr W de56s3工、A 广-a/A法 DI-DFkDW/rQob MstrlHICI-HEMTgMbl7-H•tt O tg17 "■ 二■ s Nr耳 一I4G STCO/1K03supx=0rHol"01135h・寸x・n盅厂 Q毛^*8N0"A就二il=01^ 1-roJ;1® 八d-003G M!r"广*一芻r Hrr ^ 国 12 ■国11 以上功能均在在 Linux 操作系统上启用并测试验证通过,暂未发现错误。 6 技术难点及解决方案 1) 初次接触 Linux 操作系统,对于原命令解释程序 shell 的命令等并不熟 悉。对于设计与实现基于 Linux 内核的命令解释程序( Shell )有一定 难度。需首先熟悉原命令解释程序 shell 的使用方法和原理,再自行实 现一个命令解释程序。 2) 外部命令执行采用直接调用 exec 系统调用的方式。 Exec 是一系列的 函数,包括 execl 、execlp 、 execle 、execv、execvp。具体使用哪个 来完成外部命令的功能,需要了解各个函数间的区别,联系和常用的用 法。 3) 系统环境变量支持的功能要求可以设置和初始化系统环境变量,如何完 成该功能是一个难点。该功能试图利用外部命令,调用原命令解释程序 shell 的 export 命令实现,但未能实现。后利用内部命令的间接调用 系统调用的方式通过 setenv() 函数实现。 7 疑难解惑及经验教训 1) 内部命令和外部命令的区分:内部命令是命令解释程序直接解释执行 的;外部命令是其他可执行程序支持的。内部命令和外部命令的区分都 是对于自行实现的命令解释程序 shell ,而不是原 Linux 操作系统上的 命令解释程序 shell 。 2) 直接调用系统调用和间接调用系统调用:间接调用系统调用是用户进程 调用 C 语言函数库中的函数来调用系统调用;直接调用系统调用是利用 syscall() 函数使用系统调用号来直接调用系统调用。 8 结论与体会 本次 Linux 命令解释程序设计与实现实验成果总结如下: 1) 设计和实现一组 内部命令一共 8 条 ,实现典型内部命令的处理功能,包 括: ls,pwd,copy,rename,echo,help,export,exit/quit ; 2) 设计和实现 外部命令一共 2条,包括: jobs,env 。执行采用直接调用 exec 系统调用的方式来实现; 3) 一条内部命令 copy 采用直接调用相应系统调用的方式来实现 ,其他内 部命令采用间接调用相应系统调用的方式来实现; 4) 系统环境变量(至少包括当前目录)支持 ,通过 export 命令功能实现 系统环境变量的设置和初始化; 5) 在 Linux 操作系统上启用并测试验证,未发现错误; 6) 命令提示符显示、命令辨别 (区分内部命令与外部命令及不同内部命 令)和执行处理; 通过本次 Linux 命令解释程序设计与实现实验,本人对于初次实操接触的 Linux 操作系统有了初步的了解。特别是对于 Linux 操作系统的原命令解释程 序的操作和一些典型命令的使用有了一定掌握。 通过对于 Linux 操作系统的原命令解释程序的学习,自行编写 C语言程序 设计实现自己的命令解释程序。在过程中,学习了 Linux 系统上的 C 语言编 辑、编译和与运行和具体一些 C 语言的头文件和函数库中的函数。并且加深了 本人对于理12 论课程中讲解的内部命令和外部命令,系统直接调用和间接调用系 统调用等概念的理解。 最终,本人自行实现了基于 Linux 内核的命令解释程序( Shell ),主要包 括系统环境变量的设置和初始化、系统命令提示符显示、命令辨别解析(区分 内部命令与外部命令及不同内部命令) 、典型内部命令等处理功能,并在 Linux 操作系统上测试验证通过。 在实验报告内容中运行结果截图的适当位置中应有机融入了个人姓名、学 号、计算机系统信息等凸显个人标记特征的信息。 9 源程序文件及源码清单 shell.c 文件源码如下: #include"stdio.h" #include"string.h" #include"unistd.h" #include"sys/types.h" #include"sys/stat.h" #include"sys/syscall.h" #include"stdlib.h" #include"dirent.h" #include"stddef.h" #include"fcntl.h" #include"malloc.h" #define buffsize 1024 #define O_RDONLY 00 #define O_RW 066 void list_(); void pwd_(); void copy_(); void rename_(); void echo_(); void help_(); int jobs_(); int environ_(); void export_(); void env_store(char command2[]); void env_export(char command2[]);struct val_struct { char name[50]; char value[50]; }; 13 int env_num=0; char *env_arrary[256]={0}; extern char **environ; int main() { char command[100]; while(1) { printf("Qin > "); scanf("%s",command); if(strcmp(command,"ls")==0){ list_(); } else if(strcmp(command,"pwd")==0){ pwd_(); } else if(strcmp(command,"copy")==0){ copy_(); } else if(strcmp(command,"rename")==0){ rename_(); } else if(strcmp(command,"echo")==0){ echo_(); } else if(strcmp(command,"help")==0){ help_(); } else if(strcmp(command,"jobs")==0){ jobs_(); } else if(strcmp(command,"env")==0){ environ_(); } else if(strcmp(command,"export")==0){ export_(); } else if(strcmp(command,"exit")==0 || strcmp(command,"quit")==0){ printf("thank you for using! bye~n"); exit(0); } else{ printf("input false! please input again!n"); } return 0; } void list_() { char command2[50]; struct dirent *entry; DIR *olist=NULL; 14 } int i=1; scanf("%s",command2); fflush(stdin); if((olist=opendir(command2))==NULL){ printf("opendir false!n"); } while(entry=readdir(olist)){ printf("file %d:%sn",i,entry->d_name); i++; } if(closedir(olist)!=0){ printf("closedir false!n"); }} void pwd_() { char *path=NULL; path=getcwd(NULL,0); printf(path); printf("n"); free(path); } void copy_() { char cp1[30],cp2[30],buf[buffsize]; int fd1,fd2; int n; int flag=1; printf("pleace input the file name to be copied:n"); scanf("%s",cp1); fflush(stdin); printf("pleace input the new file name:n"); scanf("%s",cp2); if((fd1=syscall(SYS_open,cp1,O_RDONLY))==-1){ printf("open the file false!n"); flag=0; } if((n=syscall(SYS_read,fd1,buf,buffsize))==-1){ printf("read the first file false!n"); flag=0; } if((fd2=syscall(SYS_creat,cp2,O_RW))==-1){ printf("create the file false!n"); flag=0; } if(syscall(SYS_write,fd2,buf,n)==-1){ printf("write the second file false!n"); flag=0; } if(syscall(SYS_close,fd1)==-1){ 15 printf("close the first file false!n"); flag=0; } if(syscall(SYS_close,fd2)==-1){ printf("close the second file false!n"); flag=0; } if(flag){ printf("copy the new file success!n"); }} void rename_() { char newname[30],oldname[30]; printf("pleace input the old file name:"); scanf("%s",oldname); fflush(stdin); printf("pleace input the new file name:"); scanf("%s",newname); 16 fflush(stdin); if(rename(oldname,newname)!=0){ printf("change the new name false!n"); } else{ printf("change the new name success!n"); }} void echo_() { int i; char command2[30]; scanf("%s",command2); fflush(stdin); int len=strlen(command2); for(i=0; i if(command2[i]!=' '){ putchar(command2[i]); } } putchar('n'); } void help_() { printf("/* "); */n printf("ls printf("pwdtdisplay the current pathn"); printf("copytcopy a file becomes a new filen"); printf("renamet rename a filen"); printf("echo printf("helptdisplay instructionsn"); printf("jobstdisplay process name "); printf("envtdisplay environment variablen"); printf("export name=value>tset environment variablen"); printf("quit,exittexit producen"); printf("/* int jobs_() {*/n"); pid_t pid = fork(); if (pid < 0){ fprintf(stderr, "Fork Failed"); return 1; } else if(pid==0){ 17 execlp("pstree","-p",NULL); } else{ wait(); } return 0; } int environ_() { pid_t pid = fork(); if (pid < 0){ fprintf(stderr, "Fork Failed"); return 1; } else if(pid==0){ execlp("env","",NULL); } else{ wait(); } return 0; } void export_() { char command2[100]; scanf("%s",command2); env_store(command2); env_export(command2); } void env_store(char command2[]) { int len=strlen(command2); env_arrary[env_num]=(char *)malloc(len+1); strcpy(env_arrary[env_num],command2); env_num++; } void env_export(char command2[]) { struct val_struct val={0}; int i=0; char *tmp=command2; while(*tmp != '='){ [i]=*tmp; i++; tmp++; } [i]='0'; tmp++; i=0; while(*tmp != '0'){ [i]=*tmp; i++; tmp++; 18 } [i]='0'; setenv(,,1); }19
版权声明:本文标题:实验课题1:Linux命令解释程序设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1703309722a446365.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论