第1关:开发自己的 mysh 程序
时间: 2023-12-08 10:01:29 浏览: 287
第一关的任务是开发自己的 mysh 程序。
mysh 程序即是实现一个简单的命令行终端,类似于常见的操作系统终端。在这个终端中,用户可以输入命令,并且程序会执行相应的操作。
首先,要开发 mysh 程序,我们需要确定这个程序的功能和设计。根据题目要求,这个 mysh 程序应该能够接收用户输入的命令,并且执行对应的操作。因此,我们需要实现以下几个功能:
1. 接收用户输入的命令:程序需要能够读取用户在终端中输入的命令,并将其保存起来以备后续执行。
2. 解析命令:接收到用户输入的命令后,程序需要能够正确地解析命令,提取出其中的命令名和参数。这样才能确定要执行的具体操作。
3. 执行命令:根据解析出的命令名和参数,程序需要能够执行相应的操作。这可以通过调用系统提供的相关函数来实现。
4. 显示结果:当命令执行完毕后,程序需要能够将执行结果正确地显示给用户。
在实际编写代码时,可以按照以上功能的步骤进行实现。首先,可以使用相关的编程语言提供的函数来接收用户输入的命令,并将其保存在一个变量中。然后,可以使用字符串处理的相关函数来解析命令,提取出命令名和参数。接下来,可以根据命令名和参数来选择合适的函数进行操作的执行,并将执行结果保存在一个变量中。最后,可以使用相关的输出函数将结果显示给用户。
总之,第一关的任务是开发一个功能简单但完整的 mysh 程序。通过实现命令的接收、解析和执行等功能,可以完成这个任务。
相关问题
编写程序mysh.c,在其主函数中读取“命令字符串”(由第二个参数开始的所有命令行参数构成),在程序中创建一个子进程,然后在子进程中调用exec执行该命令字符串。如:用户输入“mysh ls -l”,则在子进程中执行“ls -l命令”。最后,父进程等待子进程执行完毕后以子进程的退出状态退出。
好的,根据您的要求,我来给您编写一个符合要求的mysh.c程序。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
pid_t pid;
int status;
if (argc < 2) {
fprintf(stderr, "Usage: %s command [args ...]\n", argv[0]);
exit(1);
}
pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) { // child process
if (execvp(argv[1], &argv[1]) < 0) {
perror("execvp");
exit(1);
}
} else { // parent process
if (waitpid(pid, &status, 0) < 0) {
perror("waitpid");
exit(1);
}
if (WIFEXITED(status)) {
printf("Child process exited with status %d\n", WEXITSTATUS(status));
}
}
return 0;
}
```
这个程序通过 `fork` 创建了一个子进程,然后在子进程中调用 `execvp` 执行命令字符串。在父进程中,使用 `waitpid` 等待子进程执行完毕,并获取子进程的退出状态。最后,将子进程的退出状态输出到标准输出。
用vi建立一个文件mysh,把上面所用到的echo$name$is$class"的学生"命令写到文件mysh中,给予mysh文件执行的权限,然后运行mysh,看是否显示出“xxx是网络2211的学生”,如果没有显示出来,你应该怎么做让它能够显示?
首先,我们需要分步操作:
1. **创建文件**:在vi编辑器中创建一个名为"mysh"的文件,输入以下内容,假设"name"和"class"已经确定为"xxx"和"2211":
```bash
echo $name "是" $class "的学生"
```
按`i`键进入插入模式,输入上述内容,然后按`Esc`键退回到命令模式。
2. **保存并关闭**:输入`:w`保存,`:q`或`:q!`退出vi。如果你在命令模式下没有看到":w"选项,可能是第一次保存,可以直接输入`:wq`。
3. **给予执行权限**:
```bash
chmod +x mysh
```
这将使文件获得可执行权限。
4. **运行文件**:
```
./mysh
```
运行这个文件,看看它是否会输出"xxx是网络2211的学生"。
如果没显示,这里有一些建议检查:
- **检查环境变量**:确认$name和$class是否设置为正确的值,比如在.bashrc或其他初始化文件中是否有正确的赋值。
- **语法错误**:确保echo命令中的字符串拼接部分无误,没有遗漏空格或多余字符。
- **权限问题**:确认运行该脚本的用户有执行权限,或者尝试sudo来运行。
阅读全文