在 C 中使用 execvp 的无限循环
Infinite Loop with execvp in C
这个程序应该是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;
}
非常感谢任何帮助或指导
获得第一个输入后,您并没有清除输入缓冲区。所以这就是无限循环的原因。
输入第一个输入后,新行将出现在 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.
^
|
在 scanf 函数中重复 \n
将是 运行 所以你必须使用以下
scanf(" %[^\n]",buffer);
这个程序应该是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;
}
非常感谢任何帮助或指导
获得第一个输入后,您并没有清除输入缓冲区。所以这就是无限循环的原因。
输入第一个输入后,新行将出现在 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.
^
|
在 scanf 函数中重复 \n
将是 运行 所以你必须使用以下
scanf(" %[^\n]",buffer);