编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。
时间: 2024-02-19 21:57:29 浏览: 65
以下是示例代码:
cmd1.c
```
#include <stdio.h>
int main() {
printf("This is cmd1\n");
return 0;
}
```
cmd2.c
```
#include <stdio.h>
int main() {
printf("This is cmd2\n");
return 0;
}
```
cmd3.c
```
#include <stdio.h>
int main() {
printf("This is cmd3\n");
return 0;
}
```
编译命令:
```
gcc cmd1.c -o cmd1
gcc cmd2.c -o cmd2
gcc cmd3.c -o cmd3
```
shell模拟程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#define MAX_CMD_LEN 100
void execute_cmd(char* cmd_name) {
pid_t pid;
int status;
pid = fork();
if (pid == 0) { // 子进程
execlp(cmd_name, cmd_name, NULL); // 执行命令
printf("command not found\n"); // 如果命令不存在,则执行这一句
exit(1);
} else if (pid > 0) { // 父进程
waitpid(pid, &status, 0); // 等待子进程结束
} else { // fork失败
printf("fork failed\n");
exit(1);
}
}
int main() {
char cmd[MAX_CMD_LEN];
while (1) {
printf("> ");
fgets(cmd, MAX_CMD_LEN, stdin); // 读取命令行输入
cmd[strlen(cmd) - 1] = '\0'; // 去除换行符
if (strcmp(cmd, "exit") == 0) { // 如果输入exit,则退出程序
break;
}
if (strcmp(cmd, "cmd1") == 0) {
execute_cmd("./cmd1");
} else if (strcmp(cmd, "cmd2") == 0) {
execute_cmd("./cmd2");
} else if (strcmp(cmd, "cmd3") == 0) {
execute_cmd("./cmd3");
} else {
printf("command not found\n");
}
}
return 0;
}
```
编译命令:
```
gcc shell.c -o shell
```
运行命令:
```
./shell
```
阅读全文