我现在正在学习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 */
}