写一个shell
如何用C语言写一个shell(叫做mysh),实现以下功能:1. 实现带有argument的命令行,比如ls -a, cat test.txt
2. 实现简单的文件输入输出重定向,比如 echo 123 >1.txt, cat <1.txt
3. 实现bash style的重定向,比如 <1.txt>3.txt cat 2.txt 4.txt 要写一个shell,需要掌握操作系统的相关知识和C语言编程技巧。下面是实现mysh的步骤:
1. 解析命令行参数
使用C语言中的main函数,获取命令行参数。将命令行参数分成两部分:命令和参数。
2. 执行命令
使用C语言中的exec函数族,执行命令。如果有参数,将参数和命令一起传递给exec。
3. 实现文件输入输出重定向
使用C语言中的文件操作函数,实现文件输入输出重定向。比如,要实现echo 123 >1.txt,可以使用fopen函数打开文件1.txt,然后使用fprintf函数将输出内容写入文件。
4. 实现bash style的重定向
使用C语言中的dup2函数,实现文件描述符的重定向。比如,要实现<1.txt>3.txt cat 2.txt 4.txt,可以使用open函数打开文件1.txt和3.txt,然后使用dup2函数将标准输入和输出重定向到文件描述符1和3。最后再执行cat 2.txt 4.txt。
下面是mysh的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_ARGS 10
int main(int argc, char *argv[]) {
char *args;
int i, in, out;
// 解析命令行参数
for (i = 0; i < MAX_ARGS - 1 && argv != NULL; i++) {
args[ i] = argv;
}
args[ i] = NULL;
// 处理输入输出重定向
for (i = 0; args[ i] != NULL; i++) {
if (strcmp(args[ i], "<") == 0) {
in = open(args, O_RDONLY);
dup2(in, STDIN_FILENO);
close(in);
args[ i] = NULL;
} else if (strcmp(args[ i], ">") == 0) {
out = open(args, O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(out, STDOUT_FILENO);
close(out);
args[ i] = NULL;
}
}
// 执行命令
execvp(args, args);
// 如果执行失败,输出错误信息
perror("execvp");
exit(EXIT_FAILURE);
}
页:
[1]