该程序应该是shell,它执行用户输入的命令。我的程序工作正常,直到我接受标志和命令。现在,程序在execvp无限循环。输入的任何命令都会执行此操作(我主要使用ls -l进行测试)。如果重要,我正在使用cc编译器在Linux机器上编写此代码。这是我目前的代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<linux/types.h>
#define MAX_LINE 80
int main(void)
{
char *args[MAX_LINE/2+1];
char buffer[80];
char *token=NULL;
char *whiteSpace = " \t\n\f\r\v";
while(1)
{
fflush(stdout);
printf("osh> ");
fflush(stdout);
scanf("%[^\n]",buffer);
int count=0;
token=strtok(buffer,whiteSpace);
args[count] = strdup(token);
count+=1;
while((token=strtok(NULL,whiteSpace))!=NULL)
{
args[count]=strdup(token);
count+=1;
}
args[count]=NULL;
pid_t pid = fork();
if(pid==0)
{
if((execvp(args[0],args))==-1)
{
printf("Error\n");
exit(1);
}
} else if(pid>0) {
if(args[count-1]=="&")
wait();
else
waitpid(pid,0,0);
} else {
exit(1);
}
}
return 0;
}
非常感谢任何帮助或指示
答案 0 :(得分:1)
获得第一个输入后,您没有清除输入缓冲区。所以这就是无限循环的原因。
输入第一个输入后,新行将在input
缓冲区中。处理完第一个输入后,缓冲区将给出\n
。
scanf("%[^\n]",buffer); // This scanf will not get the input.
所以buffer
将包含用户给出的第一个命令。所以它将处理该输入。
将此行结束于while
循环或scanf
。
声明变量int c;
while((c=getchar()) != '\n' && c != EOF);// for clearing the buffer until newline or End-Of-File character.
否则你可以这样使用,
scanf(" %[^\n]",buffer); // to skip the white space character.
^
|
答案 1 :(得分:0)
在scanf函数中,\n
将重复运行,因此您必须使用以下
scanf(" %[^\n]",buffer);