gpt4 book ai didi

c - 全局变量未保持设置状态,可能是由 fork() 引起的

转载 作者:行者123 更新时间:2023-11-30 15:45:21 26 4
gpt4 key购买 nike

我正在尝试用 C 语言编写一个非常非常简单的 unix shell,除了对历史命令的支持之外,我已经掌握了所需的基础知识。我有一个全局二维字符数组,其中保存所有输入命令的历史记录。命令是在 fork() 系统调用之前添加的,我最初是在添加字符串后打印历史全局数组的值,并且它们打印正确,所以我不确定为什么它不打印命令“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;
}

最佳答案

更改:

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

至:

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

关于c - 全局变量未保持设置状态,可能是由 fork() 引起的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19083432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com