我现在正在学习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#或者与我的问题不相似问题,从我的理解。
我还会待几个小时,所以如果我错过任何信息,请随时发表评论并要求澄清,信息或其他任何内容。
答案 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 */
}