在 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);