【发布时间】: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]=="&")进行比较。使用if(!strcmp(args[count-1],"&"))。这种情况下的逻辑很简单:&不应该作为参数传递给execvp,wait需要一个参数。使用waitpid(-1, NULL, WNOHANG)。还包括<sys/wait.h>和<sys/types.h>,而不是Linux 特定的<linux/types.h>。fflush(stdout)没用。您不会在scanf中检查缓冲区溢出,也不会在扫描参数时...
标签: c shell fork infinite-loop execvp