gpt4 book ai didi

c - C 中的 execvp 无限循环

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

该程序应该是 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. 

因此缓冲区将包含用户给出的第一个命令。所以它将处理该输入。

将此行置于 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.
^
|

关于c - C 中的 execvp 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29001581/

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