C语言实现Shell脚本重定向函数check4redirection和执行函数execute代码
时间: 2023-05-25 22:06:29 浏览: 145
以下是一个简单的C语言实现Shell脚本重定向函数check4redirection和执行函数execute的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXARGS 20
#define MAXLINE 80
int check4redirection(char *cmd, int *in, int *out) {
int i, len, pos = 0;
char *args[MAXARGS];
char *infile, *outfile;
len = strlen(cmd);
for (i = 0; i < len; i++) {
if (cmd[i] == '<') {
infile = strtok(&cmd[i+1], " \t\n");
*in = open(infile, O_RDONLY);
if (*in == -1) {
perror("Open file error");
return -1;
}
cmd[i] = '\0';
}
if (cmd[i] == '>') {
outfile = strtok(&cmd[i+1], " \t\n");
*out = open(outfile, O_WRONLY|O_TRUNC|O_CREAT, 0644);
if (*out == -1) {
perror("Open file error");
return -1;
}
cmd[i] = '\0';
}
}
args[pos++] = strtok(cmd, " \t\n");
while ((args[pos++] = strtok(NULL, " \t\n")) != NULL);
args[pos] = NULL;
if (*in != STDIN_FILENO) {
if (dup2(*in, STDIN_FILENO) == -1) {
perror("Dup2 error");
return -1;
}
close(*in);
}
if (*out != STDOUT_FILENO) {
if (dup2(*out, STDOUT_FILENO) == -1) {
perror("Dup2 error");
return -1;
}
close(*out);
}
return execvp(args[0], args);
}
int execute(char *cmd) {
int pid, status, in = STDIN_FILENO, out = STDOUT_FILENO;
if ((pid = fork()) == -1) {
perror("Fork error");
return -1;
}
else if (pid == 0) {
return check4redirection(cmd, &in, &out);
}
else {
while (wait(&status) != pid);
return status;
}
}
int main(int argc, char *argv[]) {
char line[MAXLINE];
int status;
while (1) {
printf("myShell> ");
fgets(line, MAXLINE, stdin);
if (strcmp(line, "exit\n") == 0)
exit(0);
status = execute(line);
printf("Exit status: %d\n", status);
}
return 0;
}
```
检查重定向的函数check4redirection接受一个命令字符串,以及两个指针(in和out),用于存储输入和输出的文件描述符。该函数首先使用strtok函数将命令字符串拆分为命令和参数数组args,然后在命令字符串中获取输入和输出文件名,并打开相应文件。最后,该函数使用dup2函数将输入和输出文件描述符复制到STDIN_FILENO和STDOUT_FILENO,并关闭原始文件描述符。最后,该函数使用execvp函数执行指定的命令和参数。
执行函数execute接受一个命令字符串并在新进程中调用check4redirection函数。如果fork失败,则返回-1。在子进程中,调用check4redirection函数执行命令。在父进程中,等待子进程执行完毕,并返回子进程的退出状态。主函数使用fgets从标准输入读取命令行,并在循环中执行命令。如果用户输入exit,则退出程序。
阅读全文