Linux系统的命令分为内部命令和外部命令两种,内部命令由Shell程序实现,如cd、echo等,Linux的内部命令数量有限,而且绝大部分都很少用到。而每一个Linux外部命令都是一个单独的应用程序,我们非常熟悉的ls、cp等绝大多数命令都是外部命令,这些命令都以可执行文件的形式存在,绝大部分放在目录/bin和/sbin中。这样一来,我们编程的难度就可以大大下降了,我们只需要实现很有限的内部命令,对于其它的输入,统统当作应用程序来执行即可。
//MyShell.c
#include <stdio.h> #include <strings.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #define MAXSIZE 100 void info_print(); int main(int argc, char const *argv[]) { /* code */ while(1){ char command[MAXSIZE]; pid_t pid; int status; info_print(); bzero(command,MAXSIZE); gets(command); if(-1==(pid=fork())){ perror("fork"); exit(-1); } if(pid>0){ wait(&status); }else{ int i,flag=0,j=0; char *file,*argv[10]; file=command; argv[flag++]=command; for(i=0;command[i]!=‘\0‘;i++){ while(command[i]==‘ ‘){ command[i++]=‘\0‘; j=1; } if(1==j){ argv[flag++]=command+i; j=0; } } argv[flag]=NULL; if(0==strncmp(file,"cd",2)){ //printf("OK%s\n",argv[1]); if(-1==chdir(argv[1])){ perror("chdir"); exit(-1); } }else{ if(-1==execvp(file,argv)){ //perror("execvp"); fprintf(stderr,"%s: command not found\n",file); } } } } return 0; } void info_print() //打印提示信息 { char buf[MAXSIZE],*username,hostname[MAXSIZE],pwd[MAXSIZE],ch; bzero(buf,MAXSIZE); bzero(pwd,MAXSIZE); bzero(hostname,MAXSIZE); if(NULL==(username=getenv("USER"))){ printf("Error: get username failure!\n"); exit(-1); } if(NULL==getcwd(pwd,MAXSIZE)){ perror("getcwd"); exit(-1); } if(-1==gethostname(hostname,MAXSIZE)){ perror("gethostname"); exit(-1); } if(0==strcmp(username,"root")){ ch=‘#‘; }else{ ch=‘$‘; } sprintf(buf,"%s@%s:%s%c ",username,hostname,pwd,ch); fprintf(stdout,"%s",buf); }
原文:http://blog.csdn.net/huangbo_embed/article/details/19343363