带有execvp的无限循环

时间:2015-03-12 03:54:12

标签: c shell fork infinite-loop execvp

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

非常感谢任何帮助或指示

2 个答案:

答案 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);