2201_75720755 2023-07-13 08:52 采纳率: 50%
浏览 171
已结题

请问下面这个代码怎么改正

下面这个代码是实现一个自己的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;
}
  • 写回答

15条回答 默认 最新

  • qllaoda 2023-07-13 09:16
    关注
    获得0.80元问题酬金

    贴出错误信息啊,是异常还是代码自己给的错误提示?

    评论

报告相同问题?

问题事件

  • 系统已结题 7月21日
  • 创建了问题 7月13日

悬赏问题

  • ¥40 微信小程序 使用vant组件ActionSheet 下拉面板,内容区域滚动会触发。scroll-view自定义下拉刷!即使设置停止下拉刷新也不行。
  • ¥15 专业问题提问,7月5号2点之前
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变
  • ¥15 使用华为ENSP软件模拟实现该实验拓扑
  • ¥15 通过程序读取主板上报税口的数据
  • ¥15 matlab修改为并行
  • ¥15 尝试访问%1服务的windows注册表时遇到问题。必须先解决此问题,然后才能运行安装过程。(请确认您正在使用管理员权限运行)373