在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例常规C/C++编程 → shell实现(c语言)

shell实现(c语言)

常规C/C++编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.08M
  • 下载次数:9
  • 浏览次数:591
  • 发布时间:2019-06-23
  • 实例类别:常规C/C++编程
  • 发 布 人:xiaoqiqi
  • 文件格式:.rar
  • 所需积分:2
 相关标签: shell

实例介绍

【实例简介】用c语言写的一个shell功能不是很全,但是基本功能已经实现
编译方式
    Makefile所在路径直接make

【实例截图】

【核心代码】

////////////////////////////////////////////////////////////////////////////////
/// @file	: shell.c
/// @brief	: linux shell
/// @date	: 2018/07/05 
/// @author : YYY (最終更新者)
/// @mail   : yinyy2825@163.com
/// @version: 1.0 新規 (更新情報(更新日、更新内容、更新案件))
///	@note	: Copyright (C) 2017,2018 Free Software Foundation, Inc.
////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
/// @实现功能	: shell的命令行
///                 cd ,...
/// @未实现功能 : shell脚本
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
///						 INCLUDE											 ///
////////////////////////////////////////////////////////////////////////////////
#include "shell_c.h"
/////有疑问请与我联系

extern int Command_Display(const char* user,const char* pwd,char* cmd,char* computer);
extern int export_c(char *cmd ,char *pCurrentEnv);

//命令行命令最多有八个参数,先设置这麽多
static char *argv[8] = {NULL};
static int argc = 0;
//命令行参数处理
static void shell_parse(char* cmd)
{
    //status=1 标志一个参数字符串还没有结束 
    //status-0 标志当前命令行字符为空格
    int status = 0;

    for(int i = 0; cmd[i]; i  )
    {
        // 将buf中第一个字符地址给 argv[argc  ],
        // 然后status置位,直到遇到空格后的下个参数,
        // 再将其字符起始地址赋给 argv[]
        if(!isspace(cmd[i])&&status == 0)
        {
            argv[argc  ] = cmd i;
            status = 1;
        }
        else if(isspace(cmd[i]))
        {
            status = 0;
            cmd[i] = 0;
        }
    }    
    for(int i =0 ;i<8;i  )
    {
        //fprintf(stdout,"argv[%d] = %s\n",i,argv[i]); 
    }
    if (!memcmp(argv[0],"ls",2)) {
        argv[argc  ] = "--color";
    }
    argv[argc] = NULL;
    argc = 0;
}

static void shell_execute()
{
    pid_t pid = fork();

    switch(pid)
    {
        //子进程创建失败
        case -1:
            perror("fork error");
            exit(EXIT_FAILURE);
            break;
            //子进程替换,fork()给子进程返回0
        case 0:

            //数组形式参数,自动检索环境变量
            execvp(argv[0], argv);
            //进程替换成功不返回,直接从替换进程处结束,如果运行到这里,说明进程替换失败,打印提示信息
            fprintf(stderr,"%s: %s\n",argv[0],"command not found"); 
            exit(EXIT_FAILURE);
            //父进程
        default:
            {
                int st;
                //阻塞等待子进程
                while(wait(&st) != pid);
            }
    }
}

int main(void)
{
    int iRslt = D_ERR;
    char cmd[1024] = {0};
    // -r  4.13.0-36-generic
    // -s  Linux
    // -n  ivilinux-VirtualBox
    // -m  x86_64
    // -v  #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018
    // -o  GNU/Linux
    char computer[256] = {0};
    struct utsname  usname;
    gethostname(computer,256);
    if(uname(&usname) != -1)
    {
        int sysRslt = system("clear");
        if(0 != sysRslt)
        {
            return D_ERR;
        }
        fprintf(stdout,"Welcome to Ubuntu 16.04.2 LTS (%s %s %s)\n\n",computer,usname.release,usname.machine); 
    }
    while(1)
    {
        //printf("start");
        char *home = getenv("HOME");
        char *pwd =  getenv("PWD");
        char *user = getenv("USER");
        iRslt = Command_Display(user,pwd,cmd,computer);
        if(D_ERR == iRslt)
        {
            continue;
        }
        else if(D_EXIT == iRslt)
        {
            break;
        }
        shell_parse(cmd);
        iRslt = export_c(argv[0] ,argv[1]);
        if(D_OK == iRslt)
        {
            continue;
        } 
        iRslt = cd_parse(argv[0],argv[1],home);
        if(D_OK == iRslt)
        {
            continue;
        } 
        shell_execute();
    }
    return D_SHELL_OK;
}

































标签: shell

实例下载地址

shell实现(c语言)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警