免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1498 | 回复: 2
打印 上一主题 下一主题

模拟SHELL环境 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-07 10:31 |只看该作者 |倒序浏览
很简单的程序

  1. /* mshell.c */
  2. #include <sys/types.h>;
  3. #include <unistd.h>;
  4. #include <sys/wait.h>;
  5. #include <string.h>;
  6. #include <errno.h>;
  7. #include <stdio.h>;

  8. void do_cd(char *argv[]);
  9. void execute_new(char *argv[]);

  10. main()
  11. {
  12.         char *cmd=(void *)malloc(256*sizeof(char));
  13.         char *cmd_arg[10];
  14.         int cmdlen,i,j,tag;

  15.         do{
  16.                 /* 初始化cmd */
  17.                 for(i=0;i<255;i++) cmd[i]='\0';

  18.                 printf("|*-=My Shell=-*| ");
  19.                 fgets(cmd,256,stdin);

  20.                 cmdlen=strlen(cmd);
  21.                 cmdlen--;
  22.                 cmd[cmdlen]='\0';

  23.                 /* 把命令行分解为指针数组cmd_arg */
  24.                 for(i=0;i<10;i++) cmd_arg[i]=NULL;
  25.                 i=0; j=0; tag=0;
  26.                 while(i<cmdlen && j<10){
  27.                         if(cmd[i]==' '){
  28.                                 cmd[i]='\0';
  29.                                 tag=0;
  30.                         }else{
  31.                                 if(tag==0)
  32.                                         cmd_arg[j++]=cmd+i;
  33.                                 tag=1;
  34.                         }
  35.                         i++;
  36.                 }
  37.                
  38.                 /* 如果参数超过10个,就打印错误,并忽略当前输入 */
  39.                 if(j>;=10 && i<cmdlen){
  40.                         printf("TOO MANY ARGUMENTS\n");
  41.                         continue;
  42.                 }
  43.                
  44.                 /* 命令quit:退出Mini Shell */
  45.                 if(strcmp(cmd_arg[0],"quit")==0)
  46.                         break;

  47.                 /* 命令cd */
  48.                 if(strcmp(cmd_arg[0],"cd")==0){
  49.                         do_cd(cmd_arg);
  50.                         continue;
  51.                 }
  52.                
  53.                 /* 外部命令或应用程序 */
  54.                 execute_new(cmd_arg);
  55.         }while(1);
  56. }

  57. /* 实现cd的功能 */
  58. void do_cd(char *argv[])
  59. {
  60.         if(argv[1]!=NULL){
  61.                 if(chdir(argv[1])<0)
  62.                         switch(errno){
  63.                         case ENOENT:
  64.                                 printf("DIRECTORY NOT FOUND\n");
  65.                                 break;
  66.                         case ENOTDIR:
  67.                                 printf("NOT A DIRECTORY NAME\n");
  68.                                 break;
  69.                         case EACCES:
  70.                                 printf("YOU DO NOT HAVE RIGHT TO ACCESS\n");
  71.                                 break;
  72.                         default:
  73.                                 printf("SOME ERROR HAPPENED IN CHDIR\n");
  74.                         }
  75.         }

  76. }

  77. /* 执行外部命令或应用程序 */
  78. void execute_new(char *argv[])
  79. {
  80.         pid_t pid;

  81.         pid=fork();
  82.         if(pid<0){
  83.                 printf("SOME ERROR HAPPENED IN FORK\n");
  84.                 exit(2);
  85.         }else if(pid==0){
  86.                 if(execvp(argv[0],argv)<0)
  87.                         switch(errno){
  88.                         case ENOENT:
  89.                                         printf("COMMAND OR FILENAME NOT FOUND\n");
  90.                                         break;
  91.                                 case EACCES:
  92.                                         printf("YOU DO NOT HAVE RIGHT TO ACCESS\n");
  93.                                         break;
  94.                                 default:
  95.                                         printf("SOME ERROR HAPPENED IN EXEC\n");
  96.                         }
  97.                         exit(3);
  98.                 }else
  99.                         wait(NULL);
  100. }

复制代码

论坛徽章:
0
2 [报告]
发表于 2004-06-07 10:46 |只看该作者

模拟SHELL环境

简单易懂.呵呵

论坛徽章:
0
3 [报告]
发表于 2004-06-07 16:56 |只看该作者

模拟SHELL环境

好东东,自己顶顶!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP