实验目的 实现一个模拟的shell 实验内容 编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。
时间: 2023-12-03 08:42:08 浏览: 101
实验代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_CMD_LEN 100 // 最大命令长度
int main() {
char cmd[MAX_CMD_LEN]; // 存储用户输入的命令
int status; // 存储子进程的状态
while (1) {
// 提示用户输入命令
printf("Please enter a command: ");
fgets(cmd, MAX_CMD_LEN, stdin); // 读取用户输入的命令
// 去除字符串结尾的换行符
cmd[strlen(cmd) - 1] = '\0';
// 如果用户输入了exit,则退出程序
if (strcmp(cmd, "exit") == 0) {
exit(0);
}
// 创建子进程
pid_t pid = fork();
if (pid < 0) { // 创建子进程失败
printf("Failed to create child process.\n");
exit(1);
} else if (pid == 0) { // 子进程
if (strcmp(cmd, "cmd1") == 0) { // 执行cmd1程序
execlp("./cmd1", "./cmd1", NULL);
exit(0);
} else if (strcmp(cmd, "cmd2") == 0) { // 执行cmd2程序
execlp("./cmd2", "./cmd2", NULL);
exit(0);
} else if (strcmp(cmd, "cmd3") == 0) { // 执行cmd3程序
execlp("./cmd3", "./cmd3", NULL);
exit(0);
} else { // 命令无效
printf("Command not found.\n");
exit(1);
}
} else { // 父进程
waitpid(pid, &status, 0); // 等待子进程结束
}
}
return 0;
}
```
其中,cmd1.c、cmd2.c、cmd3.c 分别如下:
cmd1.c:
```c
#include <stdio.h>
int main() {
printf("This is cmd1.\n");
return 0;
}
```
cmd2.c:
```c
#include <stdio.h>
int main() {
printf("This is cmd2.\n");
return 0;
}
```
cmd3.c:
```c
#include <stdio.h>
int main() {
printf("This is cmd3.\n");
return 0;
}
```
编译命令如下:
```bash
gcc -o cmd1 cmd1.c
gcc -o cmd2 cmd2.c
gcc -o cmd3 cmd3.c
gcc -o myshell myshell.c
```
运行 myshell 程序即可。
阅读全文