catalpa-bungei 发表于 2023-9-21 21:17:25

写一个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

isdkz 发表于 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;
    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]
查看完整版本: 写一个shell