下面这个代码是实现一个自己的shell中的一段代码,但是运行后发生了段错误,请问应该怎么改正呢
#include "shell.h"
#define TOK_DELIM " "
#define TOK_BUFFER_SIZE 64
#include <malloc.h>
char ** split_line(char *buffer);
int search_command(char **tokens);
int change_directory(char **tokens);
int exit_command(char* buffer);
int display_former_command(node* n);
int find_command_with_prefix(char **tokens);
int list_files();
/**
* shell的入口
*/
void prefix() {
char cwd[255];
getcwd(cwd, sizeof(cwd));
printf("%s$ ", cwd);
}
int execute(char* buffer) {
char **tokens = split_line(buffer);
if(strcmp(tokens[0] , "cd") == 0) {
return change_directory(tokens);
}else if(strcmp(tokens[0] , "exit") == 0) {
return exit_command(buffer);
}else if(strcmp(tokens[0] , "!#") == 0) {
return display_former_command(Log.head);
}else if(tokens[0][0] == '!' && tokens[0][1] != '#') {
return find_command_with_prefix(tokens);
}else if(strcmp(tokens[0] , "ls") == 0) {
return list_files();
}else{
return search_command(tokens);
}
free(tokens);
tokens=NULL;
return 1;
}
char ** split_line(char *buffer){
int buffer_size = TOK_BUFFER_SIZE;
char **tokens = (char **)malloc(buffer_size*sizeof(char *));
int id = 0;
char *token = (char *)malloc(buffer_size*sizeof(char));
token = strtok(buffer, TOK_DELIM);
for(id=0; token != NULL; id++){
strcpy(tokens[id], token);
token = strtok(NULL, TOK_DELIM);
}
free(token);
token = NULL;
tokens[id]=NULL;
return tokens;
}
int search_command(char **tokens){
char tokens_sh[100]={'\0'};
if(strcmp(tokens[0], "args") != 0){
strcpy(tokens_sh, "./");
}
strcat(tokens_sh, tokens[0]);
int pid = fork();
if(pid == 0){ // child process
if(execvp(tokens_sh, tokens[0]) < 0){
printf("%s: no such command\n", tokens[0]);
}
exit(1);
}else{
log_push(&Log, tokens[0]);
wait(pid);
}
return 1;
}
int change_directory(char **tokens){
char dir[255];
strcpy(dir, tokens[1]);
if(chdir(dir)) {
printf("%s: No such file or directory\n", tokens[1]);
}
log_push(&Log,tokens[1]);
return 1;
}
int exit_command(char* buffer){
free(buffer);
return 0;
}
int display_former_command(node* n) {
if(n==NULL)
return 1;
display_former_command(n->next);
printf("%s\n",n->cmd);
return 1;
}
int find_command_with_prefix(char **tokens){
char* search = log_search(&Log, tokens[0]+1);
if(search != NULL) {
log_push(&Log, search);
execute(search);
} else {
printf("No Match\n");
}
return 1;
}
int list_files(){
log_push(&Log, "ls");
system("ls");
return 1;
}