C语言写一段满足以下要求的代码,简单Shell程序的基本功能要求:实现通过命令行界面接收用户的输入,执行用户输入的命令,判断命令是否有效,支持管道和重定向命令,命令执行结果或出错信息在命令行界面显示,提供内部命令用于显示使用帮助和退出本Shell程序。
时间: 2024-02-17 09:04:21 浏览: 113
好的,以下是一段简单的Shell程序的代码,满足您的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_CMD_LEN 1024 // 最大命令长度
#define MAX_ARG_NUM 128 // 最大参数个数
void execute_cmd(char **args, int arg_num) {
pid_t pid; // 进程ID
int status; // 状态码
int fd; // 文件描述符
int pipefd[2]; // 管道
int in_fd = STDIN_FILENO; // 输入文件描述符
int out_fd = STDOUT_FILENO; // 输出文件描述符
int i, j;
// 判断是否是内部命令
if (strcmp(args[0], "help") == 0) {
printf("This is a simple shell program.\n");
printf("You can enter any command you want to execute.\n");
printf("The shell supports piping and redirection.\n");
printf("The following internal commands are supported:\n");
printf(" help - show this help\n");
printf(" exit - exit this shell\n");
return;
} else if (strcmp(args[0], "exit") == 0) {
exit(0);
}
// 判断是否需要重定向输入或输出
for (i = 0; i < arg_num; i++) {
if (strcmp(args[i], "<") == 0) {
in_fd = open(args[i + 1], O_RDONLY);
if (in_fd < 0) {
printf("open file %s error\n", args[i + 1]);
exit(1);
}
for (j = i; j < arg_num - 2; j++) {
args[j] = args[j + 2];
}
arg_num -= 2;
i--;
} else if (strcmp(args[i], ">") == 0) {
out_fd = open(args[i + 1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (out_fd < 0) {
printf("open file %s error\n", args[i + 1]);
exit(1);
}
for (j = i; j < arg_num - 2; j++) {
args[j] = args[j + 2];
}
arg_num -= 2;
i--;
}
}
// 判断是否需要管道
for (i = 0; i < arg_num; i++) {
if (strcmp(args[i], "|") == 0) {
if (pipe(pipefd) < 0) {
printf("create pipe error\n");
exit(1);
}
args[i] = NULL;
pid = fork();
if (pid == 0) {
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
execute_cmd(args, i);
close(pipefd[1]);
exit(0);
} else if (pid < 0) {
printf("fork error\n");
exit(1);
} else {
close(pipefd[1]);
dup2(pipefd[0], STDIN_FILENO);
for (j = i + 1; j < arg_num; j++) {
args[j - i - 1] = args[j];
}
arg_num -= i + 1;
i = -1;
}
}
}
pid = fork();
if (pid == 0) {
dup2(in_fd, STDIN_FILENO);
dup2(out_fd, STDOUT_FILENO);
execvp(args[0], args);
printf("exec error\n");
exit(1);
} else if (pid < 0) {
printf("fork error\n");
exit(1);
} else {
waitpid(pid, &status, 0);
}
// 关闭文件描述符
if (in_fd != STDIN_FILENO) {
close(in_fd);
}
if (out_fd != STDOUT_FILENO) {
close(out_fd);
}
}
int main() {
char cmd[MAX_CMD_LEN]; // 命令缓冲区
char *args[MAX_ARG_NUM]; // 参数
int arg_num; // 参数个数
int i;
while (1) {
printf("$ ");
fgets(cmd, MAX_CMD_LEN, stdin);
// 去除换行符
if (cmd[strlen(cmd) - 1] == '\n') {
cmd[strlen(cmd) - 1] = '\0';
}
// 解析命令
arg_num = 0;
args[arg_num] = strtok(cmd, " ");
while (args[arg_num] != NULL) {
arg_num++;
args[arg_num] = strtok(NULL, " ");
}
// 执行命令
execute_cmd(args, arg_num);
}
return 0;
}
```
这段代码实现了一个简单的Shell程序,可以接收用户输入的命令,并执行命令。程序支持管道和重定向命令,并提供了内部命令用于显示使用帮助和退出本Shell程序。
阅读全文