可以实现大部分命令,cd 和 su 除外。
my_sh.c 代码:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#define PROMPT ">"
#define ARG_CNT 32
void cmd_line_to_arglist(char** arglist, char* cmd_line);
int main()
{
char cmd_line[1024] ;
char* arglist[ARG_CNT];
while(memset(cmd_line,0,1024),printf("%s",PROMPT), fgets(cmd_line, 1024,stdin ) !=NULL)
{
if(cmd_line[0] != '\n')
{
cmd_line[strlen(cmd_line) - 1] = '\0';
cmd_line_to_arglist(arglist, cmd_line);
if(fork() > 0)
{
wait(NULL);
}else
{
execvp(arglist[0],arglist);
}
}
}
return 0 ;
}
void cmd_line_to_arglist(char** arglist, char* cmd_line)
{
int word_cnt = 0 ;
int first, second ;
int word_len,index_copy ;
first = 0 ;
while(cmd_line[first] != '\0')
{
while(cmd_line[first] == ' ' && cmd_line[first] != '\0')
{
first ++ ;
}
if(cmd_line[first] == '\0')
{
break ;
}
second = first ;
while(cmd_line[second] !=' ' && cmd_line[second] != '\0')
{
second ++ ;
}
word_len = second - first ;
arglist[word_cnt] = (char*)calloc(word_len + 1, 1) ;
for(index_copy = 0 ; index_copy < word_len ; index_copy ++)
{
arglist[word_cnt][index_copy] = cmd_line[index_copy + first];
}
word_cnt ++ ;
first = second ;
}
arglist[word_cnt] = NULL ;
}