shell.rar

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 12
    下载次数
  • 2009-10-21 11:00
    上传日期
在MINIX的系统下,建立一个自己的Shell,可以执行你要求的命令
shell.rar
  • shell.c
    17.2KB
内容介绍
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> #define BUFFERSIZE 80 #define MAXSTRING 20 char default_hpath[50]; char myprompt[10]; int stringnum=0; char newstring[20][50]; char stringname[20][10]; int main(void) { char *get_profile(void); char *read_command(char *buffer); int exec_command(char *lib_path, char *input); int pipe_number(const char *input); int pipe_command(char *lib_path, char *input); int parallel_number(const char *input); int parallel_command(char *lib_path, char *input); void sig_handler(int sig); char *path,*buffer; char *command, *lib_path; int k,j; if((buffer=(char *)malloc(BUFFERSIZE*(sizeof(char))))==0) { printf("error! can't malloc enough space for buffer\n"); return (0); } (void *)signal(SIGINT, sig_handler); lib_path=get_profile(); chdir(default_hpath); while(1) { path=getcwd(buffer,80); printf("%s %s", path, myprompt); command=read_command(buffer); if(command==NULL) continue; if(strlen(command)!=0) { k=pipe_number(command); j=parallel_number(command); if(j!=0) parallel_command(lib_path, command); else if(k!=0) pipe_command(lib_path, command); else exec_command(lib_path, command); } } free(command); free(path); free(lib_path); } void sig_handler(int sig) { char ans; printf(" are you sure? Y/N : "); ans=getchar(); if(ans=='Y' || ans=='y') { printf("bye bye ! \n"); exit(1); } else { printf("you still exit \n"); exit(1); } } int parallel_command(char *lib_path, char *input) { int exec_command(char *lib_path, char *input); int parallel_number(const char *input); int pipe_number(const char *input); int pipe_command(char *lib_path, char *input); int len,i,j,k,m=0; int status; char **order; int *child; len=strlen(input); k=parallel_number(input); order=(char **)malloc((k+1)*sizeof(char *)); for(i=0;i<k+1;i++) order[i]=(char *)malloc((len+1)*sizeof(char)); child=(int *)malloc((k+1)*sizeof(char *)); /*get the command which are separated by the parallel operator*/ k=0; j=0; for (i=0;i<=len;i++) { if (input[i]!='&') { order[k][j]=input[i]; j++; } else { order[k][j]='\0'; k++; j=0; } } i=0; while(i<k+1) { if ((child[i]=fork())==0) { m=pipe_number(order[i]); if(m != 0) pipe_command(lib_path, order[i]); else exec_command(lib_path, order[i]); exit(1); } else { /*wait for child*/ waitpid(child[i],&status,0); i++; } } for(i=0;i<k+1;i++) free(order[i]); free(order); free(child); return 1; } int pipe_command(char *lib_path, char *input) { int exec_command(char *lib_path, char *input); int pipe_number(const char *input); int len,i,j,k; int status, **fd; char **order; int *child; len=strlen(input); k=pipe_number(input); order=(char **)malloc((k+1)*sizeof(char *)); for(i=0;i<k+1;i++) order[i]=(char *)malloc((len+1)*sizeof(char)); child=(int *)malloc((k+1)*sizeof(char *)); fd=(int **)malloc(k*sizeof(int *)); for(i=0;i<k;i++) fd[i]=(int *)malloc(2*sizeof(int)); /*get the command which are separated by the pipe*/ k=0; j=0; for (i=0;i<=len;i++) { if (input[i]!='|') { order[k][j]=input[i]; j++; } else { order[k][j]='\0'; k++; j=0; } } /*create the pipe*/ for(i=0;i<k;i++) if(pipe(fd[i]) == -1) { fprintf(stderr, "Open pipe error !\n"); /*printf("Open pipe error !\n");*/ return 0; } /*create the first child*/ i=0; if((child[i]=fork())==0) { close(fd[i][0]); if(fd[i][1] != STDOUT_FILENO) { /* redirect the stadard output to the writen port of the pipe*/ if(dup2(fd[i][1], STDOUT_FILENO) == -1) { fprintf(stderr, "Redirect Standard Out error !\n"); /*printf("Redirect Standard Out error !\n");*/ return -1; } /*close the written port of the pipe*/ close(fd[i][1]); } exec_command(lib_path, order[i]); exit(1); /*child1 exit*/ } else { /*wait for child*/ waitpid(child[i],&status,0); close(fd[i][1]); } i++; while(i<k) { if ((child[i]=fork())==0) { if(fd[i][0] != STDIN_FILENO) { /* redirect the stadard input to the read port of the pipe*/ if(dup2(fd[i-1][0], STDIN_FILENO) == -1) { fprintf(stderr, "Redirect Standard In error !\n"); /*printf("Redirect Standard In Error !\n");*/ return -1; } close(fd[i-1][0]); /* redirect the stadard output to the writen port of the pipe*/ if(dup2(fd[i][1], STDOUT_FILENO) == -1) { fprintf(stderr, "Redirect Standard Out error !\n"); /*printf("Redirect Standard Out error !\n");*/ return -1; } close(fd[i][1]); } exec_command(lib_path, order[i]); exit(1); } else { /*wait for child*/ waitpid(child[i],&status,0); close(fd[i][1]); i++; } } /*create the last child*/ if((child[i] = fork()) == 0) { close(fd[i-1][1]); if(fd[i-1][0] != STDIN_FILENO) { /* redirect the stadard input to the read port of the pipe*/ if(dup2(fd[i-1][0], STDIN_FILENO) == -1) { fprintf(stderr, "Redirect Standard In error !\n"); /*printf("Redirect Standard In Error !\n");*/ return -1; } close(fd[i-1][0]); } exec_command(lib_path, order[i]); exit(1); } else { waitpid(child[i], NULL, 0); close(fd[i-1][1]); } for(i=0;i<k;i++) free(fd[i]); free(fd); for(i=0;i<k+1;i++) free(order[i]); free(order); free(child); return 1; } void do_cd(char *argv[]) /*special for cd*/ { if(argv[1]!=NULL) { if(chdir(argv[1])<0) switch(errno) { case ENOENT: fprintf(stderr,"DIRECTORY NOT FOUND\n"); break; case ENOTDIR: fprintf(stderr,"NOT A DIRECTORY NAME\n"); break; case EACCES: fprintf(stderr,"YOU DO NOT HAVE RIGHT TO ACCESS\n"); break; default: fprintf(stderr,"SOME ERROR HAPPENED IN CHDIR\n"); } } } int exec_command(char *lib_path, char *input) { char **analize(const char *input); char *is_file_exist(const char *command, char *lib_path); FILE *stream; char ftwo[20], firsts[200], seconds[50]; int namesize=0; int stringsize=0; int c_number(const char *input); int pipe_number(const char *input); char *command_path, *real_command, *buffer, *run_path; char **analized_command; char ans; int i,j,k,m,len; pid_t pid; len=strlen(input); real_command=(char *)malloc((len+1)*(sizeof(char))); if((buffer=(char *)malloc(BUFFERSIZE*(sizeof(char))))==0) { printf("error! can't malloc enough space for buffer\n");
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...