编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。
时间: 2023-12-03 12:43:34 浏览: 32
以下是三个程序的代码:
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;
}
```
然后我们可以编写一个 shell 程序,根据用户输入的命令名去执行相应的程序。
shell.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_CMD_LENGTH 100
int main() {
char cmd[MAX_CMD_LENGTH];
while (1) {
printf("shell> ");
fgets(cmd, MAX_CMD_LENGTH, stdin);
cmd[strcspn(cmd, "\n")] = '\0'; // 去除换行符
if (strcmp(cmd, "exit") == 0) {
break;
}
pid_t pid = fork();
if (pid == -1) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程执行命令
execlp(cmd, cmd, NULL);
// 如果 execlp 函数返回,则说明出错
perror("exec error");
exit(EXIT_FAILURE);
} else {
// 父进程等待子进程结束
int status;
do {
waitpid(pid, &status, WUNTRACED);
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
// 如果子进程执行出错,则打印错误信息
if (WEXITSTATUS(status) != 0) {
printf("command not found\n");
}
}
}
return 0;
}
```
运行 shell 程序后,可以输入 cmd1、cmd2、cmd3 来执行相应的程序。如果输入 exit,则退出程序。如果输入无效命令,则显示"command not found",继续等待。
阅读全文