linux下实现简易shell

Posted wangyubjhd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下实现简易shell相关的知识,希望对你有一定的参考价值。

编写思路:

  1. 显示提示符$*
  2. 标准输入读取命令
    • 以空格为界分割字符串
    • 对cd命令作特出处理*
    • 处理(使用signal函数忽略)信号SIGINT(2)SIGQUIT(3)*
    • 指定键入exit退出shell*
  3. fork子进程调用execvp
    • execvp(argv[0], argv)argv参数由步骤1生成
    • 父进程使用waitpid处理返回信号*

标*暂未实现

 

 1 #include <sys/types.h>
 2 #include <sys/wait.h>
 3 #include <unistd.h>
 4 #include <signal.h>
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8 #include "mysh.h"
 9 
10 void initShell()
11 {
12     while (1) {
13         prompt();
14            fflush(stdout);
15         fflush(stdin);
16         char buf[1024];
17         memset(buf, 0, sizeof(buf));
18         ssize_t size = read(0, buf, sizeof(buf) - 1);
19         if (size > 0) {
20             buf[size - 1] = ; // del ‘
‘
21         }
22         char *argv[64] = {0};
23         parse(buf, argv);
24     
25         int pid = fork();
26         if (pid == -1) {
27             perror("fork");
28             exit(-1);
29         }
30         if (pid == 0) {
31             execvp(argv[0], argv);
32         } else {
33             waitpid(-1, NULL, 0);
34         }
35     }
36 }
37 
38 void prompt()
39 {
40     printf("begin type cmd: ");
41 }
42 
43 void parse(char *buf, char *argv[])
44 {
45     char *p = buf;
46     int n = 0;
47     argv[n++] = p;
48     while (*p != ) {
49         if (*p ==  ) {
50             *p = ;
51             ++p;
52             argv[n++] = p;
53         } else {
54             ++p;
55         }
56     }
57     argv[n] = NULL;
58 }        

github源码

 

以上是关于linux下实现简易shell的主要内容,如果未能解决你的问题,请参考以下文章

手动实现一个简易linux中shell

手动实现一个简易linux中shell

手动实现一个简易linux中shell

手动实现一个简易linux中shell

Linux实现简易的Shell命令行解释器

Shell外壳的简易模拟