鱼C论坛

 找回密码
 立即注册
查看: 1557|回复: 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
小甲鱼最新课程 -> https://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的代码示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>

  6. #define MAX_ARGS 10

  7. int main(int argc, char *argv[]) {
  8.     char *args[MAX_ARGS];
  9.     int i, in, out;

  10.     // 解析命令行参数
  11.     for (i = 0; i < MAX_ARGS - 1 && argv[i + 1] != NULL; i++) {
  12.         args[ i] = argv[i + 1];
  13.     }
  14.     args[ i] = NULL;

  15.     // 处理输入输出重定向
  16.     for (i = 0; args[ i] != NULL; i++) {
  17.         if (strcmp(args[ i], "<") == 0) {
  18.             in = open(args[i + 1], O_RDONLY);
  19.             dup2(in, STDIN_FILENO);
  20.             close(in);
  21.             args[ i] = NULL;
  22.         } else if (strcmp(args[ i], ">") == 0) {
  23.             out = open(args[i + 1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
  24.             dup2(out, STDOUT_FILENO);
  25.             close(out);
  26.             args[ i] = NULL;
  27.         }
  28.     }

  29.     // 执行命令
  30.     execvp(args[0], args);

  31.     // 如果执行失败,输出错误信息
  32.     perror("execvp");
  33.     exit(EXIT_FAILURE);
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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