#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等的功能。
转载于:https://blog.51cto.com/ab3813/1761904