fork()和Execve,minix系统C,核心转储

时间:2015-11-05 22:34:44

标签: c shell minix execve

我现在正在学习C并且自己负责在Minix虚拟机中创建一个shell,我是通过使用Minix中已有的库函数来完成的,例如ls,cd等。 ..

我遇到了一个问题,在分配子进程之后,我正在引起核心转储,而不是执行我的命令

#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

    /*Initialise variables*/
    int pid;
    char *envp[] = { NULL };
    char userInput[256];

void isParent(){
    int stat;
    waitpid(-1, &stat, 0);
}

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

    /*Infinite loop to cause shell to be "permenant"*/
    while(1){
        /*"*" to lead every line*/
        printf("%s","*");
        /*Get user input*/
        scanf("%s", userInput); 
        /*Leave an exit clause, to not be permenantly stuck in loop*/
        if(strcmp(userInput, "exit") == 0){
            exit(1);
        }
        /*create my child process*/
        pid = fork(); 

        /*if process is parent, wait*/
        if (pid != 0){
        isParent(); 
        }
        /*Perform function typed by the user*/
        execve(userInput, &argv[1], envp);          
    }
}

这是我到目前为止使用的代码,当将/ bin / ls作为我的shell的参数传递时,我可以在一个用户输入中将它打印ls两次,但是在执行时它会退出shell行为,它不应该。我希望能够使用其他功能,让它们打印一次,然后返回等待用户输入。

当没有传递参数时,shell只接受“退出”,没有其他命令。如果我从main方法,execve或两者中删除参数子句(argv []),它们会抛出错误,这是你期望的。

我已经阅读了有关我所使用的所有功能的文档,并且已经专门选择了它们,所以我很感激不必更改它们,除非我正在做的事情实际上不可能用它们。

还在学习C,所以我会欣赏较小的技术术语或更容易理解的短语。我不确定我以前的问题是不是我的问题,但是我用大约20种不同的方式搜索了我的问题,我的问题的大多数版本都是为c ++编写的,c#或者与我的问题不相似问题,从我的理解。

我还会待几个小时,所以如果我错过任何信息,请随时发表评论并要求澄清,信息或其他任何内容。

1 个答案:

答案 0 :(得分:0)

变化:

    /*if process is parent, wait*/
    if (pid != 0){
    isParent(); 
    }
    /*Perform function typed by the user*/
    execve(userInput, &argv[1], envp);

为:

    /*if process is parent, wait*/
    if (pid != 0){
    isParent(); 
    }
    else
    {
    /*Perform function typed by the user*/
    execve(userInput, &argv[1], envp);
    _exit(0); /* just in case */
    }