实验目的 实现一个模拟的shell 实验内容 编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。
时间: 2023-12-03 18:44:03 浏览: 18
以下是模拟shell程序的C代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_COMMAND_LENGTH 100 // 定义最大命令长度
// 命令函数声明
void cmd1();
void cmd2();
void cmd3();
int main() {
char command[MAX_COMMAND_LENGTH]; // 命令字符串缓存
while (1) { // 循环接收命令
printf("please input command: ");
fgets(command, MAX_COMMAND_LENGTH, stdin); // 从标准输入读取命令
// 去除命令字符串末尾的换行符
int len = strlen(command);
if (command[len - 1] == '\n') {
command[len - 1] = '\0';
}
if (strcmp(command, "exit") == 0) { // 如果输入exit,则退出循环
break;
}
pid_t pid = fork(); // 创建子进程
if (pid == 0) { // 子进程中执行命令
if (strcmp(command, "cmd1") == 0) {
cmd1();
} else if (strcmp(command, "cmd2") == 0) {
cmd2();
} else if (strcmp(command, "cmd3") == 0) {
cmd3();
} else { // 输入无效命令
printf("command not found\n");
}
exit(0); // 子进程退出
} else if (pid > 0) { // 父进程中等待子进程结束
int status;
waitpid(pid, &status, 0);
}
}
return 0;
}
// 命令函数实现
void cmd1() {
printf("this is cmd1\n");
}
void cmd2() {
printf("this is cmd2\n");
}
void cmd3() {
printf("this is cmd3\n");
}
```
编译命令:
```
gcc -o shell shell.c cmd1.c cmd2.c cmd3.c
```
其中,cmd1.c/cmd2.c/cmd3.c 分别是输出不同字符串的命令程序,shell.c 是模拟 shell 程序的主程序。