全局变量没有保持设置,可能是由fork()引起的

时间:2013-09-29 21:23:37

标签: c shell

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

感谢任何看过的人。

#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;
}

1 个答案:

答案 0 :(得分:1)

变化:

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

为:

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