【问题标题】:Infinite Loop with execvp in CC中带有execvp的无限循环
【发布时间】:2015-05-14 03:01:11
【问题描述】:

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

非常感谢任何帮助或指导

【问题讨论】:

  • 您的代码中有一些拼写错误。你写strtoke而不是strtok
  • 您可以使用GNU readline,它会为您创建历史记录、制表符补全……并为您正确读取行。 bash 使用它作为它的主要组件。
  • 对不起,这只是一个错字,这只是一个错误,把它放在这里。不在我的实际代码中
  • 您无法将字符串与if(args[count-1]=="&amp;") 进行比较。使用if(!strcmp(args[count-1],"&amp;"))。这种情况下的逻辑很简单:&amp; 不应该作为参数传递给execvpwait 需要一个参数。使用waitpid(-1, NULL, WNOHANG)。还包括&lt;sys/wait.h&gt;&lt;sys/types.h&gt;,而不是Linux 特定的&lt;linux/types.h&gt;fflush(stdout) 没用。您不会在scanf 中检查缓冲区溢出,也不会在扫描参数时...

标签: c shell fork infinite-loop execvp


【解决方案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.
        ^
        |

【讨论】:

    【解决方案2】:

    在scanf函数中反复\n会运行所以你必须使用下面的

        scanf(" %[^\n]",buffer);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2020-10-31
      • 2021-04-29
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多