|
发表于 2023-9-21 21:17:48
|
显示全部楼层
要写一个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[MAX_ARGS];
- int i, in, out;
- // 解析命令行参数
- for (i = 0; i < MAX_ARGS - 1 && argv[i + 1] != NULL; i++) {
- args[ i] = argv[i + 1];
- }
- args[ i] = NULL;
- // 处理输入输出重定向
- for (i = 0; args[ i] != NULL; i++) {
- if (strcmp(args[ i], "<") == 0) {
- in = open(args[i + 1], O_RDONLY);
- dup2(in, STDIN_FILENO);
- close(in);
- args[ i] = NULL;
- } else if (strcmp(args[ i], ">") == 0) {
- out = open(args[i + 1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
- dup2(out, STDOUT_FILENO);
- close(out);
- args[ i] = NULL;
- }
- }
- // 执行命令
- execvp(args[0], args);
- // 如果执行失败,输出错误信息
- perror("execvp");
- exit(EXIT_FAILURE);
- }
复制代码 |
|