linux下实现自己的shell解释器

实现一个自己的shell解释器,其原理比较简单,首先获取用户的输入,通过fork()函数获取两个进程(父子进程),子进程通过execvp()函数继续进行,此时父进程一直在等待子进程的结束,待都结束了就执行了一次shell解释。

 1 /*============================================
 2   > Copyright (C) 2014 All rights reserved.
 3   > FileName:my_shell.c
 4   > author:donald
 5   > date:2014/08/21/ 16:08:03
 6   > details:
 7 ==============================================*/
 8 #include <unistd.h>
 9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/wait.h>
13 #include <sys/types.h>
14 #define N 1024
15 #define ARR_SIZE 32
16 int save_to_arg(char line[N],char *arg[N]){
17     memset(arg,0,sizeof(arg));
18     int head,tail;
19     char temp[ARR_SIZE];
20     int pos,index;
21     index = 0;
22     head = 0;
23     while(line[head] != ‘\0‘){
24         while(line[head] == ‘ ‘ && line[head] != ‘\0‘){
25             head ++;
26         }
27         if(line[head] == ‘\0‘){
28             break;
29         }
30         tail = head;
31         while(line[tail] != ‘ ‘ && line[tail] != ‘\0‘){
32             tail ++;
33         }
34
35         pos = 0;
36         memset(temp,0,ARR_SIZE);
37         while(head != tail){
38             temp[pos] = line[head];
39             head ++;
40             pos ++;
41         }
42
43         arg[index] = (char*)calloc(1,strlen(temp));//arg是一个指向字符数组的指针,必须申请空间        //如果声明arg为一个二维数组就不用为其分配
44         strcpy(arg[index],temp);
45
46         index ++;//!!!!!!!!!
47     }
48     arg[index] = NULL;
49     return index;
50 }
51 int main(int argc, const char *argv[])
52 {
53     int index,len;
54     char *arg[N];
55     char line[N];
56     while(memset(line,0,N),printf(">>"),fgets(line,N,stdin) != NULL){
57         line[strlen(line)-1] = ‘\0‘;
58         if(line[0] == ‘\n‘){
59             continue;
60         }
61       len =  save_to_arg(line,arg);
62
63         if(fork() == 0){
64             if(execvp(arg[0],arg) == -1){
65                 perror("error");
66             }
67         }else{
68            wait(NULL);
69         }
70     }
71     return 0;
72 }
  • execvp()函数非正常退出将会返回 -1 ,通过获取其值,并对其加以判断,就可以实现在用户输入shell中没有的指令时出现提示消息。
  • 在键入ls时为了实现颜色,可以进行如下操作,eg:ls -l --color=auto.

linux下实现自己的shell解释器,布布扣,bubuko.com

时间: 2024-12-17 21:32:20

linux下实现自己的shell解释器的相关文章

Linux下QT中执行shell命令

当需要在QT中执行shell命令时可以利用以下方法: (1)首先包含头文件: #include <QProcess> (2)执行shell命令: QProcess::execute("ls"); ///////////////////// #include  <QProcess> void Widget:on_pushButton_clicked() { //* system("ls");//调用LINUX C函数库中的system(cons

linux下各种形式的shell加法操作总结(转)

linux 下shell加法操作总结: #!/bin/bash n=1;echo -n "$n " let "n = $n + 1" echo -n "$n " : $((n = $n + 1)) echo -n "$n " (( n = n +1 )) echo -n "$n " : $[ n = $n +1 ] echo -n "$n " n=$[ $n + 1 ] echo -n

Linux下经常使用的shell命令记录

硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息具体信息,如每一个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 这里的单位是MB cat /proc/meminfo #查看内存具体信息 磁盘相关 lsblk #查看硬盘和分区分布,显示非常直观 df -h #查看各分区使用情况 cat /proc/partitions #查看硬盘和分区 mount | column -t #查看挂接的分区状态 网卡相关 lsp

Linux 下批量创建用户(shell 命令)

第一种方法: 用shell批量创建用户,分为2中:1,批量创建的用户名无规律 :2.批量创建的用户名有规律首先,来说下批量创建的用户名无规律的shell:先把需要批量创建的用户名用一个文本文档列出来,如下图的userlist文件再把与用户名匹配的密码用另一个个文本文档列出来,如下图的passwd文件 这两个文本文档内容,如下图所示: 下面是我编写的shell脚本.如下图所示 注意需要导入我们在userlist中写的用户名与passwd中写的与用户名匹配的密码项注:chpasswd命令#以root

linux下编写一个仿shell

1.首先了解shell的基本框架 如上图所示 [用户名@主机名 当前路径]$ 命令 执行命令结果 目标:完成一个简单的shell(输入命令可以得到执行结果) 所以框架分为: 1.[提示符]$的显示 -----一堆函数的调用即可 2.  命令的执行-----读入数据,进行解析,得到argv[],执行execvp 3.  对于内置命令cd的单独处理 #include <stdio.h> #include <pwd.h> #include <sys/types.h> #inc

Linux下使用popen()执行shell命令

简单说一下popen()函数 函数定义 #include <stdio.h> FILE * popen(const char *command , const char *type ); int pclose(FILE *stream); 函数说明 popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数.pclose()函数关闭标准I/O流,等待命令执行结束,然后返回sh

linux下C/C++调用shell

添加头文件       #include<stdlib.h> void main() { system("echo 1 > default.conf"); } 编译运行,发现本目录下多了一个default.conf文件,内容为1. 这应该是很方便的一个功能. 原文地址:https://www.cnblogs.com/flamewen/p/10125520.html

linux下SSH服务利用shell脚本实现密钥的批量分发与执行

SSH项目利用shell脚本实现密钥的批量分发与执行 1 ssh密钥的批量分发 开始安装sshpass免交互工具并进行SSH-key的批量分发 1.1 下载epel源并更新yum仓库 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y clean all yum makecache 1.2 安装sshpass工具 yum -y install sshpass 2 创建密钥文件 2

Linux下启动停止服务shell脚本

jenkins构建重新部署时脚本: #!/bin/bash app=auth jar_pid=`ps -ef|grep -v grep | grep 'java -jar e-$app-controller-1.0-SNAPSHOT.jar'|awk '{ print $2 }'` echo $jar_pid if [ ! -n "$jar_pid" ]; then echo 'will redeploy.' #rm -rf nohup.out nohup java -jar e-$a