文档库 最新最全的文档下载
当前位置:文档库 › shell.c

shell.c

shell.c
shell.c

//制作一个简单的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;

}

相关文档