#include <stdio.h> 

#include <stdlib.h>

#include <string.h>

#include <sys/wait.h>

#include <unistd.h>

void swap(char **p,char **q)

{

char *tmp=*p;

*p=*q;

*q=tmp;

}


int main(int argc,char *argv[])

{

pid_t id;

while(1){

printf("[root@localhost fangfang]# ");

fflush(stdout);

char cmd_str[1024];

memset(cmd_str,'\0',sizeof(cmd_str));

ssize_t size=read(0,cmd_str,sizeof(cmd_str)-1);

if(size>=0){

cmd_str[size-1]='\0';

}

char *my_argv[32];

int index=0;

int len=strlen(cmd_str)-1;

while(len-->0){

if(cmd_str[len]==' ' && (cmd_str[len+1] ==' '|| cmd_str[len+1]=='\0')){

len--;

}else if(cmd_str[len]==' '){

my_argv[index++]=&cmd_str[len+1];

cmd_str[len]='\0';

}

}

if(cmd_str[0]!=' ')

{

my_argv[index++]=cmd_str;

my_argv[index]='\0';

}

int j=index-1;

int i=0;

while(i<j){

swap(&my_argv[i++],&my_argv[j--]);

}

// for(i=0;i<index;++i)

// {

// printf("%s\n",my_argv[i]);

// }

    if(strcmp("cd",my_argv[0]==0)){

chdir(my_argv[1]);

continue;

}

id=fork();

if(id<0){

perror("fork");

exit(1);

}else if(id==0){

execvp(my_argv[0],my_argv);

exit(1);

}else{

pid_t _wait_pid=waitpid(id,NULL,0);

if(_wait_pid==id){

//DO NOHANG

}

}

}

return 0;

}

               

这只是一个简单的shell,如果需要更好的使用还需完善bash等的功能。