1. 尝试自行设计一个C语言小程序,完成最基本的shell角色:给出命令行提示符、能够逐次接受命令;对于命令分成三种,内部命令(例如help命令、exit命令等)、外部命令(常见的ls、cp等,以及其他磁盘上的可执行程序HelloWorld等)以及无效命令(不是上述三种命令)将上述shell进行扩展,使得你编写的shell程序具有支持管道的功能,也就是说你的shell中输入“dir |more”能够执行dir命令并将其输出通过管道将其输入传送给more作为标准输入。。
时间: 2023-12-03 09:46:26 浏览: 138
以下是一个基本的C语言shell程序,支持内置命令(help、exit)、外部命令以及无效命令。同时,还支持管道功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_CMD_LENGTH 1024
#define MAX_ARGS 64
void execute_command(char **args, int input_fd, int output_fd) {
pid_t pid = fork();
if (pid == 0) {
if (input_fd != STDIN_FILENO) {
dup2(input_fd, STDIN_FILENO);
close(input_fd);
}
if (output_fd != STDOUT_FILENO) {
dup2(output_fd, STDOUT_FILENO);
close(output_fd);
}
execvp(args[0], args);
perror("execvp");
exit(EXIT_FAILURE);
} else if (pid > 0) {
wait(NULL);
} else {
perror("fork");
}
}
void run_command(char *command) {
char *args[MAX_ARGS];
char *arg = strtok(command, " \t\n");
int arg_count = 0;
while (arg != NULL && arg_count < MAX_ARGS - 1) {
args[arg_count++] = arg;
arg = strtok(NULL, " \t\n");
}
args[arg_count] = NULL;
if (arg_count == 0) {
return;
}
if (strcmp(args[0], "help") == 0) {
printf("This is a basic shell program.\n");
printf("Available commands: help, exit.\n");
} else if (strcmp(args[0], "exit") == 0) {
exit(EXIT_SUCCESS);
} else {
int input_fd = STDIN_FILENO;
int output_fd = STDOUT_FILENO;
char *token = strtok(NULL, "|");
while (token != NULL) {
int pipe_fds[2];
if (pipe(pipe_fds) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
execute_command(args, input_fd, pipe_fds[1]);
close(pipe_fds[1]);
input_fd = pipe_fds[0];
arg = token;
arg_count = 0;
while (arg != NULL && arg_count < MAX_ARGS - 1) {
args[arg_count++] = arg;
arg = strtok(NULL, " \t\n");
}
args[arg_count] = NULL;
token = strtok(NULL, "|");
}
execute_command(args, input_fd, output_fd);
}
}
int main() {
char command[MAX_CMD_LENGTH];
while (1) {
printf("$ ");
fflush(stdout);
if (fgets(command, MAX_CMD_LENGTH, stdin) == NULL) {
break;
}
run_command(command);
}
return 0;
}
```
上述程序中,`execute_command()` 函数用于执行一个命令,并支持重定向输入输出。`run_command()` 函数用于解析命令,并根据命令类型执行相应操作。在解析命令时,如果遇到 `|` 符号,则将命令按照管道分割,并依次执行。
阅读全文