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



我现在正在学习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将只接受"退出",而不接受其他命令。如果我从主方法execve或两者中删除argument子句(argv[]),它们会引发错误,这是意料之中的。

我已经阅读了关于我使用过的所有功能的文档,并具体选择了它们,所以我很感激不必更改它们,除非我实际无法使用它们。

仍在学习C,所以我会喜欢更小的技术术语或更容易理解的短语。我真的不确定我的问题以前是否被提出过,但我已经用大约20种不同的方式在谷歌上搜索了我的问题,我的问题的大多数版本都是为c++、c#编写的,或者根据我的理解,与我的问题不相似。

我还会在这里呆上几个小时,所以如果我错过了任何信息,请随时发表评论,要求澄清、提供信息或其他任何信息。

更改:

    /*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 */
    }

相关内容

  • 没有找到相关文章

最新更新