Написание оболочки на 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Я не вижу никакого списка процессов вообще. Я думаю, что есть проблема с родительским кодом, и, возможно, с моей логикой управления.

0 ответов

Другие вопросы по тегам