Linux系統的命令分為內部命令和外部命令兩種,內部命令由Shell程序實現,如cd、echo等,Linux的內部命令數量有限,而且絕大部分都很少用到。而每一個Linux外部命令都是一個單獨的應用程序,我們非常熟悉的ls、cp等絕大多數命令都是外部命令,這些命令都以可執行文件的形式存在,絕大部分放在目錄/bin和/sbin中。這樣一來,我們編程的難度就可以大大下降了,我們只需要實現很有限的內部命令,對於其它的輸入,統統當作應用程序來執行即可。
//MyShell.c
#include
#include
#include
#include
#include
#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]!=' ';i++){
while(command[i]==' '){
command[i++]=' ';
j=1;
}
if(1==j){
argv[flag++]=command+i;
j=0;
}
}
argv[flag]=NULL;
if(0==strncmp(file,cd,2)){
//printf(OK%s
,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
,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!
);
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);
}