在LINUXC中以多进程方式实现微型SHELL摘要:LinuxC为用户提供了一个强大的编程环境。该文分析并讨论了linuxOS下微型Shell的基本功能及实现机制,然后运用Linux下的多进程编程技术在LinuxC中设计了一个微型Shell,并给出了具体实现办法。关键词:LinuxC;LinuxOS;多进程编程;微型Shell:TP316文献标识码:A:1009-3044(2010)07-1602-03RealizationofMiniShellbyMulti-ProcessinLinuxCZHANGZhi-feng(CollegeofComputerScienceandTechnology,InnerMongoliaUniversityforNationalities,Tongliao028043,China)Abstract:LinuxCprovidesapowerfulprogrammingenvironmentforusers.Thepaperanalyzesanddiscussestheminishell'sbasicfunctionsandimplementationmechanismsundertheLinuxOS,andthendesignsamini-Shellbasedonmulti-processtechnologyintheLinuxC,andshowsaspecificimplementation.Keywords:linuxC;linuxOS;multi-processprogramming;minishellLinux的图形化环境有很大改进,在XWindow系统下,用户几乎可以完成所有的操作,只需打开shell提示来完成极少的任务,然而,许多Linux功能在shell提示下要比在图形化用户界面GUI下完成得更快[1]。众所周知,进程是操作系统和并发程序设计的一个非常重要的概念,本文主要应用Linux下的fork()等系统调用,使用多进程编程技术,设计和实现了一个微型shell(能完成LinuxOS标准shell的一部分功能),最后给出了在LinuxC下的实现代码。1微型Shell的基本功能及实现机制1.1Shell的基本功能Shell是功能强大的命令解释器,它不属于内核部分,而是在核心之外,以用户态方式运行[2],其最主要的功能是解释并执行用户键入的命令,实现用户与Linux核心的接口[3],它是Linux系统的重要组成部分。本文设计的微型shell就是要实现shell的最主要的功能。1.2微型Shell的实现机制系统初启后,核心为每个终端用户建立一个进程去执行Shell解释程序。它的执行过程基本上按如下步骤进行:1)读取用户由键盘输入的命令行,如命令末尾有号(后台命令符号),则设置后台执行标识,否则前台执行。2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execvp()内部处理所要求的形式。3)终端进程调用fork()建立一个子进程,当子进程运行时调用execvp(),从而达到执行用户提交命令所对应的可执行文件,将它调入内存,执行这个程序(解释这条命令)。4)如果命令末尾有号(后台命令符号),则终端进程不用系统调用wait()(或waitpid())等待,立即发提示符,让用户输入下一个命令,转1);如果命令末尾没有号,则终端进程要一直等待。当子进程完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。2Linux下的多进程编程欲实现微型shell的设计,要涉及Linux的如下几个主要的基于进程的系统调用函数:2.1fork()函数[4]fork函数(vfork函数功能与此类似)是用来创建子进程的函数,其函数原型如下所示:Pid_tfork();fork函数无参数,当一个进程调用它时,就出现两个几乎一模一样的进程。fork可能有以下三种不同的返回值:1)在父进程中,fork返回新创建的子进程的进程ID;2)在子进程中,fork返回0;3)如果出现错误,fork返回一个负值。2.2exec()函数调用fork函数后,子进程和父进程几乎完全一样,而多数情况下,子进程需要执行与父进程不同的代码,为此Linux系统提供了exec系统调用,以便用指定的目标程序更换进程的执行映象。Shell进程所创建的子进程正是使用它来执行用户键入的命令。exec函数有6种不同的使用格式,在本文只使用execvp格式,其函数原型如下:Intexecvp(constchar*filename,constchar*argv[]);其中,参数filename指出可执行目标程序的文件名,它可以通过环境变量PATH来搜索;参数argv是一个字符指针数组,它指出可执行目标程序使用的命令行参数表,按约定第一个字符指针指向与filename相同的字符串,最后一个指针指向一个空字符串,其余的指向该程序执行时所带的命令行参数。2.3wait()函数进程一旦调用了wait函数(waitpid函数功能与此类似),就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果它找到这样一个已经变成“僵尸”的子进程,...