linux用C语言模拟shell并且实现重定向
时间: 2023-10-21 17:05:17 浏览: 155
要实现一个简单的shell,可以用C语言中的系统调用来完成。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_COMMAND_LENGTH 1024
int main() {
char command[MAX_COMMAND_LENGTH];
char *args[MAX_COMMAND_LENGTH / 2 + 1];
char *token, *saveptr;
int i, background, redirect_in, redirect_out;
int fd_in, fd_out;
pid_t pid;
while (1) {
printf("shell> ");
fflush(stdout);
fgets(command, MAX_COMMAND_LENGTH, stdin);
if (command[strlen(command) - 1] == '\n') {
command[strlen(command) - 1] = '\0';
}
if (strcmp(command, "exit") == 0) {
break;
}
background = 0;
redirect_in = 0;
redirect_out = 0;
i = 0;
token = strtok_r(command, " ", &saveptr);
while (token != NULL) {
if (strcmp(token, "&") == 0) {
background = 1;
} else if (strcmp(token, "<") == 0) {
redirect_in = 1;
token = strtok_r(NULL, " ", &saveptr);
fd_in = open(token, O_RDONLY);
if (fd_in == -1) {
perror("open");
exit(EXIT_FAILURE);
}
dup2(fd_in, STDIN_FILENO);
} else if (strcmp(token, ">") == 0) {
redirect_out = 1;
token = strtok_r(NULL, " ", &saveptr);
fd_out = open(token, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd_out == -1) {
perror("open");
exit(EXIT_FAILURE);
}
dup2(fd_out, STDOUT_FILENO);
} else {
args[i++] = token;
}
token = strtok_r(NULL, " ", &saveptr);
}
args[i] = NULL;
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
execvp(args[0], args);
perror("execvp");
exit(EXIT_FAILURE);
} else {
if (!background) {
waitpid(pid, NULL, 0);
}
}
if (redirect_in) {
close(fd_in);
}
if (redirect_out) {
close(fd_out);
}
}
return 0;
}
```
这个shell可以处理基本的命令,并且可以实现输入和输出的重定向。例如,要将命令的输出重定向到文件中,可以使用 ">" 符号。要将命令的输入重定向到文件中,可以使用 "<" 符号。注意,在使用这些符号时,需要在命令和符号之间留出空格。
例如,要将命令 "ls" 的输出重定向到文件 "output.txt" 中,可以输入以下命令:
```
shell> ls > output.txt
```
要将文件 "input.txt" 的内容作为命令 "grep hello" 的输入,可以输入以下命令:
```
shell> grep hello < input.txt
```
需要注意的是,在重定向输入时,需要先打开文件,并使用 `dup2()` 函数将文件描述符转换为标准输入。在重定向输出时,需要先打开文件,并使用 `dup2()` 函数将文件描述符转换为标准输出。最后,使用 `close()` 函数关闭文件描述符。
阅读全文