鱼C论坛

 找回密码
 立即注册
查看: 1236|回复: 1

写一个shell

[复制链接]
发表于 2023-9-21 21:17:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如何用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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表