编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。
时间: 2024-02-19 11:57:53 浏览: 131
下面是三个简单的 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;
}
```
编译这三个程序:
```
gcc -o cmd1 cmd1.c
gcc -o cmd2 cmd2.c
gcc -o cmd3 cmd3.c
```
然后写一个模拟 shell 的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#define MAX_CMD_LENGTH 1024
int main() {
char cmd[MAX_CMD_LENGTH];
while (1) {
printf("myshell> ");
fgets(cmd, MAX_CMD_LENGTH, stdin);
// 删除换行符
cmd[strcspn(cmd, "\n")] = 0;
// 如果是 exit 命令,退出循环
if (strcmp(cmd, "exit") == 0) {
break;
}
// 创建子进程执行命令
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
char *argv[] = {cmd, NULL};
execvp(cmd, argv);
perror("execvp");
exit(EXIT_FAILURE);
} else {
// 父进程等待子进程结束
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
// 子进程正常结束
int exit_status = WEXITSTATUS(status);
if (exit_status != 0) {
fprintf(stderr, "Command failed with exit status %d.\n", exit_status);
}
} else if (WIFSIGNALED(status)) {
// 子进程被信号终止
int signal_number = WTERMSIG(status);
fprintf(stderr, "Command terminated by signal %d.\n", signal_number);
}
}
}
return 0;
}
```
这个程序会不断等待用户输入命令,并创建子进程去执行对应的程序。如果接收到的命令为 exit,则退出循环,结束程序。如果接收到无效命令,则显示 "command not found",继续等待。
阅读全文