基本信息
源码名称:shell实现(c语言)
源码大小:0.08M
文件格式:.rar
开发语言:C/C++
更新时间:2019-06-23
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
用c语言写的一个shell功能不是很全,但是基本功能已经实现
编译方式
Makefile所在路径直接make
用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;
}