0

我正在尝试用 C 编写一个非常简单的 unix shell,除了对历史命令的支持之外,我已经具备了我需要工作的基础知识。我有一个全局 2D 字符数组,其中包含所有输入命令的历史记录。命令是在 fork() 系统调用之前添加的,我最初是在添加字符串后打印出历史全局数组的值,并且它们打印正确,所以我不确定为什么它什么时候打印不出来在 shell 中使用命令“history”。

感谢任何看的人。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "myhistory.h"

int BUFFER_SIZE = 1024;
char history[100][80];

int command_index = 0;

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

int status = 0;
int num_args;
pid_t pid;

while(1){

    char *buffer_input, *full_input;
    char command[BUFFER_SIZE];
    char *args[BUFFER_SIZE];

    printf("myshell> ");
    buffer_input = fgets(command, 1024, stdin);

    full_input = malloc(strlen(buffer_input)+1);
    strcpy(full_input, buffer_input);


    if (command_index >= 100) {
        command_index = 0;
    }

    strncpy(history[command_index], full_input, strlen(full_input) + 1);
    command_index += 1;

    parse_input(command, args, BUFFER_SIZE, &num_args);


    //check exit and special command conditions
    if (num_args==0)
        continue;

    if (!strcmp(command, "quit" )){
        exit(0);
    }

    if(!strcmp(command, "history")){
        int i;
        fprintf(stderr,"%d\n",(int)pid);
        for(i = 0; i < command_index; i++){
            fprintf(stdout, "%d: %s\n",i+1,history[command_index]);
        }

        continue;
    }

    errno = 0;
    pid = fork();
    if(errno != 0){
        perror("Error in fork()");
    }
    if (pid) {
        pid = wait(&status);
    } else {

        if( execvp(args[0], args)) {
            perror("executing command failed");
            exit(1);
        }
    }
}
return 0;
}


void parse_input(char *input, char** args,
            int args_size, int *nargs){

    char *buffer[BUFFER_SIZE];
    buffer[0] = input;

    int i = 0;
    while((buffer[i] = strtok(buffer[i], " \n\t")) != NULL){
        i++;
    }

    for(i = 0; buffer[i] != NULL; i++){
        args[i] = buffer[i];
    }
    *nargs = i;
    args[i] = NULL;
}
4

1 回答 1

1

改变:

        fprintf(stdout, "%d: %s\n",i+1,history[command_index]);

至:

        fprintf(stdout, "%d: %s\n",i+1,history[i]);
于 2013-09-29T22:02:02.127 回答