实例介绍
编译方式
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
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论