我正在尝试使用C实现一个最小的shell。我将在linux机器上运行它。
基本上,execvp()似乎没有执行任何操作。为什么会这样?我有一些代码试图查看是否有错误。我输入mini-shell的任何命令都会返回该错误语句。此外,没有任何事情发生,一个确定的迹象是无法正常工作。
我正在处理的书中的问题是将execvp()
称为execvp(args[0], args)
。我在stackoverflow上看到这个作为调用它的方式,但有些人还建议execvp(args[0],args[1])
它是哪一个?
我认为现在我处理用户输入的方式几乎没有错误,但如果有什么东西只是指出它。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#define MAXLINE 80
int main(void)
{
char *args[MAXLINE/2 + 1]; //cl w/ 40 max args
//the above is an array of pointers-to-char
char *s;
int k;
int pid;
int lastarg;
int status;
int should_run = 1; //determines when to exit
printf("CS149 Shell from MYNAME HERE\n");
while(should_run)
{
/* PROMPT */
printf("AUTHOR-L3006323213> ");
fflush(stdout);
s = (char*) calloc ( 200, sizeof(char) );
fgets(s,199,stdin);
/* PARSE */
k=0;
args[k] = strtok(s," \n\t");
while(args[k])
{
printf("%d %s\n",k, args[k] );
++k;
args[k] = strtok(NULL," \n\t");
}
args[k]=NULL;
lastarg=k-1;
/* HANDLE EXIT */
if (strcmp(args[0],"exit\n") == 0)
{
should_run=0;
continue;
}
//fork child process using fork();
pid = fork();
if(pid<0) printf("ERROR!\n");
else if(pid==0)
{ //child
if(execvp(args[0], &args[1]) < 0)
printf("Command not found.\n");
exit(1);
}
else
{ //parent
//check last arg for == &
printf("Parent is ");
if(strcmp(args[lastarg],"&") == 0)
printf(" not waiting...\n");
else
{
printf("waiting...\n");
while (wait(&status) != pid);
}
}
/* Cleanup for next prompt */
free(s);
}
return 0;
}
编辑:所以我设法修复了一些事情。我现在正在使用execvp()
调用execvp(args[0], &args[1])
。如果我给我的终端ps &
,我会看到一个进程列表,但是另一个提示不会出现。当我给我的终端ps
时,我根本看不到任何进程列表。我认为父代码存在问题,可能还有我的控制逻辑。