用C语言实现myshell的输入重定向功能和输出重定向功能
时间: 2024-03-03 10:53:18 浏览: 65
以下是实现输入重定向和输出重定向的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define MAX_CMD_LEN 256
int main() {
char cmd[MAX_CMD_LEN];
char *args[MAX_CMD_LEN];
char *input_file, *output_file;
int input_fd, output_fd;
int i, j;
while (1) {
printf("myshell> ");
fgets(cmd, MAX_CMD_LEN, stdin); // 读取命令行输入
if (feof(stdin)) { // 用户输入Ctrl+D,退出程序
printf("\n");
break;
}
// 解析命令行参数
args[0] = strtok(cmd, " \n");
i = 1;
while ((args[i] = strtok(NULL, " \n")) != NULL) {
i++;
}
args[i] = NULL;
// 查找输入输出重定向符号
input_file = NULL;
output_file = NULL;
for (j = 0; j < i; j++) {
if (strcmp(args[j], "<") == 0) { // 输入重定向符号
input_file = args[j+1];
args[j] = NULL;
break;
}
if (strcmp(args[j], ">") == 0) { // 输出重定向符号
output_file = args[j+1];
args[j] = NULL;
break;
}
}
// 执行命令
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) { // 子进程
// 输入重定向
if (input_file != NULL) {
input_fd = open(input_file, O_RDONLY);
if (input_fd == -1) {
perror("open input file");
exit(1);
}
if (dup2(input_fd, STDIN_FILENO) == -1) {
perror("dup2 input");
exit(1);
}
close(input_fd);
}
// 输出重定向
if (output_file != NULL) {
output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (output_fd == -1) {
perror("open output file");
exit(1);
}
if (dup2(output_fd, STDOUT_FILENO) == -1) {
perror("dup2 output");
exit(1);
}
close(output_fd);
}
// 执行命令
execvp(args[0], args);
perror(args[0]);
exit(1);
} else { // 父进程
waitpid(pid, NULL, 0);
}
}
return 0;
}
```
在上述代码中,我们首先解析用户输入的命令行参数,查找输入输出重定向符号 `<` 和 `>`,并分别获取输入和输出文件名。接着,在子进程中,我们使用 `open()` 函数打开输入或输出文件,并使用 `dup2()` 函数将标准输入或标准输出重定向到文件描述符。最后,我们使用 `execvp()` 函数执行用户输入的命令。在父进程中,我们使用 `waitpid()` 函数等待子进程结束。
阅读全文