Написание оболочки на C с помощью fork() и execvp(). Почему execvp ничего не выполняет?
Я пытаюсь реализовать минимальную оболочку с использованием C. Я буду запускать ее на Linux-машине.
По сути, execvp(), похоже, ничего не выполняет. Почему это? У меня есть код, который пытается увидеть, если есть ошибка. Любая команда, которую я ввожу в свою мини-оболочку, возвращает это сообщение об ошибке. Кроме того, ничего не происходит, верный признак того, что что-то не работает.
Проблема из книги, над которой я работаю, говорит, что execvp()
как execvp(args[0], args)
, Я считаю, что это упоминается в stackru как способ его вызова, но некоторые также предлагают 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
Я не вижу никакого списка процессов вообще. Я думаю, что есть проблема с родительским кодом, и, возможно, с моей логикой управления.