//制作一个简单的shell
#include
#include
#include
#include
#include
void shell_help()
{
printf("cd<目录>:更改目录\n");
printf("environ :显示环境变量字符串的设置\n");
printf("echo<内容>:显示内容并换行\n");
printf("jobs:显示shell的一系列子进程\n");
printf("qiut,exit,bye:退出shell\n");
printf("batch:如果shell带文件名,打开该文件并执行文件内容\n");
printf("debugging提供-v选项\n");
printf("prompt:解释器应该打印$PS2");
printf("background:如果以&终止,后台并发执行该程序\n");
}
int main()
{
FILE *fp;
pid_t pid,parent_pid;
int i,m;
char n[10],r[100],s[100],str[256];
memset(r,0,100);
getcwd(r,100);
char
arr[12][10]={"cd","environ","echo","help","jobs","quit","exit","bye","batch","debugging","promp t","background"};
while(1)
{
printf("请输入命令(cd,environ,echo,help,jobs,quit,exit,bye,batch,debugging,prompt,background)\n");
printf("[kun102@localhost %s]$ ",r);
scanf("%s",&n);
memset(s,0,100);
gets(s);
for(i=0;i<12;i++)
if(strcmp(n,arr[i])==0)
m=i;
if(m<8)
{
switch(m)
{
case 0:
if(s[1]=='\0')
printf("%s\n",r);
else if(chdir(s+1)==0)
{
printf("更改目录成功!\n");
strcpy(r,s+1);
}
else printf("目录不存在,更改错误!\n");
break;
case 1:
if((pid=fork())<0)
{
printf("fork error!\n");
exit(EXIT_FAILURE);
}
else if(pid==0)
{
if(execl("/bin/env","env",(char *)0)<0)
printf("execl error\n");
exit(EXIT_FAILURE);
}
waitpid(pid,0,0);
break;
case 2:
puts(s);
break;
case 3:
shell_help();
break;
case 4:
parent_pid=getpid();
printf("父进程为%d\n",parent_pid);
if((pid=fork())<0)
{
printf("fork error!\n");
exit(EXIT_FAILURE);
}
else if(pid==0)
{
if(execl("/bin/ps"," --ppid parent_pid",(char *)0)<0)
printf("execl error\n");
exit(EXIT_FAILURE);
waitpid(pid,0,0);
break;
case 5:
exit(0);break;
case 6:
exit(0);break;
case 7:
exit(0);break;
default:printf("it's error!");
}
}
else if(m<12)
{
switch(m)
{
case 8:
if((fp=fopen((s+1),"r"))==NULL)
{
printf("openning error!");
}
while(!feof(fp))
{
fgets(str,256,fp);
system(str);
}
exit(0);break;
case 9:
if(!strcmp(s+1,"-v"))
{
char debug[200];
strcpy(debug,"gdb");
//strcat(debug,p[0]);
system(debug);
continue;
}
break;
case 10:
if((pid=fork())<0)
{
printf("fork error!\n");
exit(EXIT_FAILURE);
}
else if(pid==0)
if(execl("/bin/ls","ls","-1",(char *)0)<0)
printf("execl error\n");
exit(EXIT_FAILURE);
}
waitpid(pid,0,0);
break;
case 11:if(!strcpy(s+1),"&")
break;
default:printf("it's error!");
}
}
else
printf("it's error\n");
}
return 0;
}