用C语言实现myshell的输入重定向功能和输出重定向功能
时间: 2024-03-03 10:53:13 浏览: 23
在myshell中实现输入重定向功能和输出重定向功能,可以使用dup2()函数来实现文件描述符的重定向,下面是一个简单的示例代码:
```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;
}
```
注意,在解析命令行参数的过程中,需要查找输入输出重定向符号,并将其后面的文件名作为重定向的文件。然后,在子进程中使用dup2()函数将文件描述符复制到标准输入或标准输出的文件描述符上。最后,关闭不需要的文件描述符。