码迷,mamicode.com
首页 > 系统相关 > 详细

linux下实现简易shell

时间:2019-01-17 12:55:32      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:oid   linu   col   stdout   title   .com   nbsp   null   返回   

编写思路:

  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] = \0; // del ‘\n‘
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 != \0) {
49         if (*p ==  ) {
50             *p = \0;
51             ++p;
52             argv[n++] = p;
53         } else {
54             ++p;
55         }
56     }
57     argv[n] = NULL;
58 }        

github源码

 

linux下实现简易shell

标签:oid   linu   col   stdout   title   .com   nbsp   null   返回   

原文地址:https://www.cnblogs.com/wangyubjhd/p/10281516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!