使用fork()和execvp()在C中编写shell。为什么execvp没有执行任何操作?

时间:2015-09-28 07:28:21

标签: c linux shell fork execvp

我正在尝试使用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时,我根本看不到任何进程列表。我认为父代码​​存在问题,可能还有我的控制逻辑。

0 个答案:

没有答案