명령 줄 셸에 대한 내역 기능을 구현하고 있습니다. 가장 최근의 명령 10 개를 보유 할 원형 배열을 구현했습니다. 각 명령은 또한 총 명령이 무엇인지를 지정하는 정수로 표시됩니다. 예를 들어 총 명령 30 개를 입력하면 원형 배열에있는 10 개의 명령에 번호가 매겨집니다 (30, 29, 28, 27, ..., 21).세그먼트 화 오류 - strcpy() - C
사용자가 명령 "r"을 입력 한 다음 10 개의 명령어 중 하나를 레이블링하는 번호를 입력하면 해당 명령어가 실행되어야합니다. 두 단어 명령이 올바르게 수용되도록 할 때 계속 seg 오류가 발생합니다. 아무도 문제가 무엇인지 지적 할 수 있습니까?
int main(void)
{
char inputBuffer[MAX_LINE]; /* buffer to hold the command entered */
int background; /* equals 1 if a command is followed by '&' */
char *args[MAX_LINE/2+1];/* command line (of 80) has max of 40 arguments */
int position, count, rnum = 0;
char historyArray[10][MAX_LINE];
char *holder[MAX_LINE]={0};
while (1){ /* Program terminates normally inside setup */
background = 0;
printf("COMMAND->");
fflush(0);
setup(inputBuffer, args, &background); /* get next command */
position = (count % MOD_VAL);
strcpy(historyArray[position],args[0]);
if(!strcmp("rr",args[0]))
{
strcpy(historyArray[position],historyArray[((position-1)+MOD_VAL)%MOD_VAL]);
printf("%i",count);
printf("%c",'.');
printf("%c",' ');
printf("%s",historyArray[position]);
printf("%c",'\n');
strcpy(args[0],historyArray[position]);
}
else if(!strcmp("r",args[0])) //SEG FAULT OCCURING IN THIS ELSE-IF BLOCK!
{
//args[1] will hold given number
printf("%c",'\n');
printf("%s",args[0]);
printf("%s",args[1]);
printf("%s",args[2]);
printf("%c",'\n'); //PRINT STATEMENTS FOR DEBUGGING
strncpy(holder[0], args[2], MAX_LINE - 1); //SEG FAULT
rnum = atoi(args[1]);
strcpy(historyArray[position],historyArray[((position-(count-rnum))+MOD_VAL)%MOD_VAL]);
strcpy(args[0],historyArray[position]); //CHANGES VALUES OF args[1], args[2]
if(holder[0] != NULL)
{
strncpy(args[1],holder[0],MAX_LINE-1);
args[2] = NULL;
}
else
{
args[1] = NULL;
}
printf("%c",'\n');
printf("%s",args[0]);
printf("%s",args[1]);
printf("%s",args[2]);
printf("%c",'\n');
}
else if(!(strcmp("h",args[0]))||!(strcmp("history",args[0])))
{
int counter = 0;
while(counter < 10)
{
printf("%i",(count - counter));
printf("%c",'.');
printf("%c",' ');
printf("%s", historyArray[((position - counter + MOD_VAL)%MOD_VAL)]);
printf("%c",' ');
printf("%c",'\n');
counter ++;
if(counter > count)
break;
}
}
count++;
pid_t pid1; //Initialize pid_t variable to hold process identifier
pid1 = fork(); //Fork process and assign process identifier to "pid1"
if (pid1 == 0) //Child process
{
//Child process executes the command specified by the user and
//then quits.
execvp(args[0], args);
exit(0);
}
else //Parent process
{
if (background != 1)//Check for inclusion of '&' in command
{
wait(NULL); //Wait for child process to finish executing
}
}
/* the steps are:
(1) fork a child process using fork()
(2) the child process will invoke execvp()
(3) if background == 0, the parent will wait,
otherwise returns to the setup() function. */
}
}
도움을 주시면 감사하겠습니다. 내가 당신이라면, 디버거에서 코어 파일을로드 args[0]
의 값이 전달 될 때 무엇을 볼 것입니다
else if(!strcmp("r",args[0]))
- 매트
매트, 들여 쓰기를 수정할 수 있습니까? 또한, 코드는'else if'로 시작하는데별로 의미가 없습니다. – JohnnyHK
구현은 모든 단일 단어 명령 (ls)에 대해 올바르게 작동합니다. mkdir dirname과 같은 입력 명령에 대해 작동하는지 확인하려고 시도합니다. 사용자 입력 : r 1 dirname; 여기서 r = args [0], 1 = args [1], dirname = args [2]. else-if의 경우 args [1]에 dirname이 필요합니다! –
죄송합니다. 코드의 길이가 다소 길어서 게시 할 수 있을지 불확실했습니다. –