linux用C语言模拟shell命令并且实现重定向
时间: 2023-08-15 11:13:34 浏览: 183
要在 Linux 上使用 C 语言模拟 shell 命令,可以使用系统调用函数来执行命令。其中,`fork()` 函数用于创建子进程,`execvp()` 函数用于在子进程中执行命令。以下是一个简单的示例:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAX_ARGS 10
#define MAX_COMMAND_LENGTH 50
int main() {
char command[MAX_COMMAND_LENGTH];
char *args[MAX_ARGS];
int background = 0;
int redirect = 0;
char *redirect_file;
while (1) {
// 读取用户输入的命令
printf("myshell> ");
fgets(command, MAX_COMMAND_LENGTH, stdin);
command[strlen(command)-1] = '\0'; // 去掉换行符
// 解析命令参数
int i = 0;
args[i] = strtok(command, " ");
while (args[i] != NULL) {
i++;
args[i] = strtok(NULL, " ");
}
args[i] = NULL;
// 判断是否后台运行
if (args[i-1] != NULL && strcmp(args[i-1], "&") == 0) {
background = 1;
args[i-1] = NULL;
}
// 判断是否重定向输出
for (int j = 0; j < i; j++) {
if (strcmp(args[j], ">") == 0) {
redirect = 1;
args[j] = NULL;
redirect_file = args[j+1];
}
}
// 创建子进程执行命令
pid_t pid = fork();
if (pid == -1) {
perror("fork error");
exit(1);
} else if (pid == 0) {
// 子进程
if (redirect) {
int fd = open(redirect_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd == -1) {
perror("open error");
exit(1);
}
dup2(fd, STDOUT_FILENO);
close(fd);
}
execvp(args[0], args);
perror("execvp error");
exit(1);
} else {
// 父进程
if (!background) {
waitpid(pid, NULL, 0);
}
}
}
return 0;
}
```
上述代码实现了一个简单的 shell,支持后台运行和重定向输出。例如,可以输入 `ls -l > output.txt` 命令将 `ls -l` 命令的输出重定向到 `output.txt` 文件中。
阅读全文