在Linux中用C简单的shell实现,fork导致无限循环

时间:2013-10-09 18:38:18

标签: c linux shell fork

我正在尝试在C中实现一个简单的shell,并且我的程序在用户有机会输入任何命令之前导致无限循环并创建大量新进程/打印Myshell>。我似乎无法找到一种方法来阻止这种情况,如果有人能帮助那就太好了! (未将#include标题粘贴在顶部

int main(int argc, char *argv[]){

    char buffer[512];
    int *status;
    size_t nargs;
    pid_t pid;
    char delim[] = "\n";

    while(1){

        pid = fork();       
        if(pid){

        printf("Myshell> ");
        fgets(buffer, 512, stdin);
        //parse(buffer, argv);

        argv[0] = strtok(buffer, delim);
        for(argc=1; argv[argc-1]; argc++){
            argv[argc] = strtok(NULL, delim);
        }       

        if(!strcmp(argv[0], "exit"))
            exit(0);

        printf("Waiting for child (%d)\n", pid);
        pid = wait(status);
        printf("Child (%d) finished\n", pid);
        exit(0);
        }else{
            if(execvp(argv[0], argv)){
                printf("error");
                exit(1);
            }else{
                exit(0);
            }
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

因为您正在使用fgets而不是命令行参数将命令读入缓冲区所以argv[argc]的{​​{1}}是错误的 - 未定义的行为。

如果未传递任何额外的命令行参数,则argc > 1是您的程序名称,argv[0]为NULL。索引到argv[1]的值大于1会导致数组超出索引问题。

而不是声明argv[]argv[]作为主函数参数在main中声明为正式变量,如:

argc

您的代码中还有一个更正:更改:

int argc;
char* argv[MAX]; // max number of argument can be pass to your shell 

as

int *status;

并相应地纠正

int status;

as

pid = wait(status);