实现简单的shell 实现一个简单的shell(命令行解释器),类似于bash, csh等。本设计的主要目的在于学会如

给出好的实现方法,谢谢!

ardprint?
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#define MAXARGS 20
#define ARGLEN 100
main()
{
char *arglist[MAXARGS+1];
int numargs;
char argbuf[ARGLEN];
char *makestring();

numargs=0;
while(numargs<MAXARGS)
{
printf("Arg[%d]?",numargs);
if(fgets(argbuf,ARGLEN,stdin)&&*argbuf!='\n')
{
arglist[numargs++]=makestring(argbuf);
}
else
{
if(numargs>0)
{
arglist[numargs]=NULL;
execute(arglist); //zhixing
numargs=0;
}
}
}
}

execute(char *arglist[])
{
int pid,exitstatus;

pid=fork();

switch(pid)
{
case -1:
perror("fork failed!");
exit(1);
case 0:
execvp(arglist[0],arglist);
perror("execvp failed!");
exit(1);
default:
while(wait(&exitstatus)!=pid)
;
printf("child exit with status %d,%d\n",exitstatus>>8,exitstatus&0377);

}

}

char *makestring(char *buf)
{
char *cp,*malloc();

buf[strlen(buf)-1]='\0';
cp=malloc(strlen(buf)+1);

if(cp==NULL)
{
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp,buf);
return cp;
}
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#define MAXARGS 20
#define ARGLEN 100
main()
{
char *arglist[MAXARGS+1];
int numargs;
char argbuf[ARGLEN];
char *makestring();

numargs=0;
while(numargs<MAXARGS)
{
printf("Arg[%d]?",numargs);
if(fgets(argbuf,ARGLEN,stdin)&&*argbuf!='\n')
{
arglist[numargs++]=makestring(argbuf);
}
else
{
if(numargs>0)
{
arglist[numargs]=NULL;
execute(arglist); //zhixing
numargs=0;
}
}
}
}

execute(char *arglist[])
{
int pid,exitstatus;

pid=fork();

switch(pid)
{
case -1:
perror("fork failed!");
exit(1);
case 0:
execvp(arglist[0],arglist);
perror("execvp failed!");
exit(1);
default:
while(wait(&exitstatus)!=pid)
;
printf("child exit with status %d,%d\n",exitstatus>>8,exitstatus&0377);

}

}

char *makestring(char *buf)
{
char *cp,*malloc();

buf[strlen(buf)-1]='\0';
cp=malloc(strlen(buf)+1);

if(cp==NULL)
{
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp,buf);
return cp;
}

这是来自unix/linux编程实践教程上的例子。

除了linux的系统调用,值得注意的是还有一些细节问题。

比如对于fgets()函数接受的字符串的处理。

char *fgets(char *s, int size, FILE *stream);
fgets() reads in at most one less than size characters from stream and
stores them into the buffer pointed to by s. Reading stops after an
EOF or a newline. If a newline is read, it is stored into the buffer.
A '\0' is stored after the last character in the buffer.

fgets 函数,从数据流读取比size少1个字符,把他们存储到s指向的缓冲区。如果遇到EOF或者换行,则

停止。如果是换行符,换行符也被存储在缓冲区。'\0'被存储在缓冲区的末尾.

所以在过程中要去掉击键产生的'\n',通过makestring(char *buf)函数。

发表于 @ 2010年10月12日 20:47:00 | 评论( 2 ) | 编辑| 举报| 收藏

旧一篇:在python中使用lambda演算 | 新一篇:大数相乘(小数点)
查看最新精华文章 请访问博客首页相关文章

本文来自CSDN博客,转载请标明出处:追问

不需要网上黏贴的东西

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-28
你不是学正则表达式了吗?学了就写个最简单的正则表达式解释器就行了。

编译原理如果学了的话,这个很容易的。上班没时间写,下班不是打球,就是做饭洗衣服。。。
周末帮你做你又等不及。。纠结。
第2个回答  2011-03-08
#include <stdio.h>
#include <signal.h>

#define MAXARGS 20 /* cmdline args */
#define ARGLEN 100 /* token length */

main()
{
char *arglist[MAXARGS+1]; /* an array of ptrs */
int numargs; /* index into array */
char argbuf[ARGLEN]; /* read stuff here */
char *makestring(); /* malloc etc */

numargs = 0;
while ( numargs < MAXARGS )
{
printf("Arg[%d]? ", numargs);
if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '/n' )
arglist[numargs++] = makestring(argbuf);
else
{
if ( numargs > 0 )
{
arglist[numargs]=NULL; /* close list*/
execute( arglist ); /* do it */
numargs = 0; /* and reset*/
}
}
}
return 0;
}

execute( char *arglist[] )
{
int pid,exitstatus; /* of child */

pid = fork(); /* make new process */
switch( pid ){
case -1:
perror("fork failed");
exit(1);
case 0:
execvp(arglist[0], arglist); /* do it */
perror("execvp failed");
exit(1);
default:
while( wait(&exitstatus) != pid );
printf("child exited with status %d,%d/n",
exitstatus>>8, exitstatus&0377);
}
}
char *makestring( char *buf )
/*
* trim off newline and create storage for the string
*/
{
char *cp, *malloc();

buf[strlen(buf)-1] = '/0'; /* trim newline*/
cp = malloc( strlen(buf)+1 ); /* get memory*/
if ( cp == NULL ){ /* or die */
fprintf(stderr,"no memory/n");
exit(1);
}
strcpy(cp, buf); /* copy chars */
return cp; /* return ptr */
}本回答被提问者采纳
第3个回答  2011-02-28
bash,csh都不是简单的,不知道你想要学什么.
搜一下brainfuck的解释器,很简单(小于100行),或许有帮助
ok了可以看他的编译器.追问

Linux 下的shell

Shell脚本 有那些类型 比如说 .csh . py .sh 这些脚本又有什么区别...
这样的形式,意思是告诉系统要使用\/bin\/bash这个解释器来解释下面的语句。shell的脚本一般用.sh作为后缀,就如1楼说的后缀名在Linux下并没有特别意义,只是便于人类区分而已,只要你写的脚本的第一行有#!\/bin\/bash或者是其他的解释器,如#!\/bin\/csh,执行该脚本时系统会使用该注明的解释器来解释。.csh...

shell编程入门(shell编程入门简单吗)
shell是一个命令处理器(commandprocessor)——是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。shell拥有自己的语言允许用户编...

什么是shell
Shell是计算机操作系统中的一种解释器,它是用户与计算机系统交互的界面。用户通过Shell输入命令,计算机系统则解释并执行这些命令。Shell可以直接调用系统的功能,如创建文件、目录、运行程序等。2. 常见的Shell 目前常用的Shell有多个版本,其中最常用的是Bash和Zsh。Bash是GNU计划的一部分,是Linux系统默认的...

编写一个shell程序,实现用for循环输出1到20间的奇数
for ((i=1;i<20;i=i+2));do echo $i done 类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。命令行式shell(Command Line Interface shell ,即CLI shell)例如:bash \/ sh \/ ksh \/ csh \/ zsh(Unix\/linux 系统)...

shell是什么意思啊
Shell是一个在计算机科学中常见的术语,特别是在Unix和Linux操作系统环境中。Shell字面上可以理解为一种“外壳”,它是用户与操作系统进行交互的界面。通过Shell,用户可以执行各种命令和操作,从而实现对计算机硬件和软件资源的控制。以下是关于Shell的详细解释:1. 基本定义:Shell是一个命令行解释器,它接收...

shell编程工具?
4、Shell是一个应用程序,是用户管理应用程序的一个接口。广义上Shell的分类?GUI:图形用户界面,KDE、GNOME、XFCE。CLI:命令行接口,bash、zsh、fishsh、csh、tcsh、ksh。5、壳层(英语:Shell)在计算机科学中,是指“提供用户使用界面”的软件,通常指的是命令行界面的解析器。6、shell单词的本意是...

shell是什么意思啊了
Shell是操作系统中的一种命令行解释器,位于用户级别与内核之间。它提供了用户与系统交互的方式,用户可以通过Shell执行命令,操作文件和目录。Shell的特点是交互性强、灵活易用、命令多样。用户可以运用Shell实现简单而又快捷的系统操作,在日常的系统管理工作中发挥不可或缺的作用。Shell语言是一种基于文本的...

linux 有哪些shell
ksh(Korn Shell):ksh是一种流行的shell,它结合了其他shell的特性并扩展了一些新功能。ksh具有强大的编程接口和命令行编辑功能,使得它成为许多系统管理员和高级用户的首选shell。csh(C Shell):csh是一种历史悠久的shell,主要受到C语言程序员的影响。它具有一些独特的特性,如命令历史记录和内置函数...

什么是shell
Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。 交互式shell和非交互式shell 交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模...

shell编程命令大全(shell编程常用命令)
5、shellscript是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的mand。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourneshell(sh)和Cshell(csh)。6、Shell实际上是一个命令解释器,它通过解释用户输入的命令并把它传输给系统内核去执行...

相似回答