学习了fork(),exec()函数之后,让我们来简单是实现来实现一个shell

里面用到了一些函数,进行对字符串进行做一下简单的处理!

#include

#include

#include

#include

#include

#include

#include

#include

#define NUM 1024

#define SIZE 50

int  mystrtok(char *argv[],char *string);

//这个函数做的是对字符串的分割,把命令分割开,用到了字符串的分割函数

int mystrtok(char *argv[],char *string)

{

int i=0;

char delim[]=" ";

char *p;

argv[0]=strtok(string,delim);//字符串分割函数的使用

//printf("%s\n",argv[0]);

while(argv[i]!=NULL)

{

argv[++i]=strtok(NULL,delim);

//printf("%s is %d\n",argv[i],i);

}

return 0;

}

//获得一个命令提示符的字符串

char *getusername(char buffer[NUM])

{

uid_t userid;

char *username;

char *hostname;

char *ptr,*p;

char buf1[1024],buf2[1024];

char *delim=".";

int id;

getwd(buf2);//这段代码说明的是对命令提示的路径获得

username=getenv("USER");//调用getenv函数,来获得shell命令的提示中的用户名

strcpy(buffer,username);

strcat(buffer,"@");

id=gethostname(buf1,sizeof buf1);//调用此函数来获取shell命令的提示中的主机名

p=strtok(buf1,delim);//对主机进行截取

strcat(buffer,p);//字符串的连接函数

ptr=strrchr(buf2,'/');//字符串的从后往前进行截取的函数,讲多得shell命令提示中的路径

//比较字符串,判断用户的路径是在"/","~",还是其他当中

if(strcmp(ptr,"/")==0)

{

ptr="/";

}

else if(strcmp(ptr,"~")==0)

{

ptr="~";

}

else

{

ptr=strtok(ptr,"/");

}

//把获得的 [用户名@主机名  路径]连接在一起

strcat(buffer," ");

strcat(buffer,ptr);

return buffer;

}

int main()

{

pid_t pid;

int status;

char *argv[NUM];

char buffer[NUM];

char str[NUM];

int j=-1;

char *string=NULL;

string=getenv("USER");

//当前用户是root用户还是普通用户,通过字符串的比较,如果是root,则返回0;

if((strcmp(string,"root"))==0)

{

j=0;

}

while(1){

//通过调用上面自定义的getusername()函数,来得到shell命令中的提示

printf("[%s]",getusername(buffer));

//判断是使用root的提示#,还是其他用户的$

if(j==0)

{

printf("# ");

}

else

{

printf("$ ");

}

//字符串的输入,要用gets函数或者用fgets函数,因为scanf函数把空格看成字符串的结束

gets(str);

//调用字符串的分割函数,获得要截取出来的命令和命令参数,例如:ls -a分别放到argv[0],argv[1]中

status=mystrtok(argv,str);

if(status!=0)

{

printf("fail to getargv!\n");

}

//通过fork()函数来创建一个父进程和一个子进程

pid=fork();

if(-1==pid)

{

printf("your fork failed!\n");

}

else if(pid==0)

{

//子进程用来对shell命令进程进程解释执行的

if(argv[1]!=NULL)

{

execvp(argv[0],argv);

}

else if(argv[1]==NULL)

{

execlp(argv[0],argv[0],NULL,NULL);

}

}

else

{

//父进程用来等待子进程的结束,然后再循环输入shell命令    if(wait(&status)==-1)    {     printf("wait failed!\n");     exit(1);    }      }  }  return 0; } 里面用到了很多的系统函数的调用,没有细细的解释说明,留给大家自学啦,哈哈!!

linux 简单Shell程序设计,利用linux下的c语言编程来简单的实现一个shell功能实现!...相关推荐

  1. linux进程创建心得体会,Linux系统下计算机C语言编程心得体会

    摘    要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...

  2. 实验linux下的编程,实验四 Linux下的C语言编程;

    <实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...

  3. linux下的c语言编程实验4,实验四-Linux下的C语言编程

    实验四Linux 下的 C 语言编程 四.实验内容 本实验要求在LINUX/UNIX环境下用C语言编写三个具体的SHELL命令,基本涉及了LINUX/UNIX文件系统中较为常用的有关文件操作的系统调用 ...

  4. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  5. 在linux下用c语言编程软件下载,在Linux下进行C语言编程

    在Linux下进行C语言编程 在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC快速入门 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] ...

  6. linux下c语言读取docx,Linux下的C语言编程.docx

    电子商务09-01 王荣宝 540913120138 Linux下的C语言编程 1 gdb调试和gcc编程综合实例 1.1 新建文件test.c,文件内容如下图所示: List列出程序源代码 本程序作 ...

  7. 操作系统实验六:Linux下的C语言编程

    实验六 Linux下的C语言编程 一.实验要求 (1)熟悉Linux环境下C语言应用程序开发的基本过程: (2)熟悉基本库函数的使用: (3)具有初步的应用程序设计能力. 二.实验内容 (1)有三个程 ...

  8. c语言编程文章排版,一种简单英文词典排版系统的实现 C语言编程

    一种简单英文词典排版系统的实现 C语言编程 答案:2  信息版本:手机版 解决时间 2019-10-06 18:43 已解决 2019-10-06 03:21 1. 一种简单的英语词典排版系统的实现 ...

  9. 用linux下的C语言编程万年历,shell编程万年历月历和对应c语言程序.docx

    shell编程万年历月历和对应c语言程序.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网 ...

最新文章

  1. NTFS for Mac OS X:使用Brew安裝NTFS-3G
  2. java中等待所有线程都执行结束
  3. Java:Comparable接口
  4. 【杂谈】如何在专家指导下系统性学习自然语言处理
  5. 【玩转cocos2d-x之三十】点九图和输入框的使用
  6. 【转】HashSet的用法
  7. Java面试之synchronized和Lock有什么区别?
  8. android组件化数据生命周期,Android组件化开发实践(七):开发常见问题及解决方案...
  9. 浏览器CSS hack整理
  10. 新概念单片机c语言 pdf,新概念51单片机C语言教程实例代码(1).pdf
  11. 制作微软引导盘实现装系统0失败uefi启动MediaCreationTool
  12. 测试用例和缺陷报告模板
  13. 社交仅发送图片和视频 -设计测试用例
  14. SQL计算每天的期初、入库、出库、结存数
  15. ACL国际计算机语言协会2019,干货 | 2019 AI 国际顶级学术会议一览表
  16. 怎么快速修改gif尺寸?仅需三步教你改gif大小
  17. 0085 开头的电话拦截方法(小米手机有效)
  18. STVD 编译提示 #error clnk :1 missing output file 的问题
  19. http协议_代理服务(proxy)
  20. Numpy攻略系列:repeat函数

热门文章

  1. 文本超出多行显示省略号 移动端禁止双击缩放
  2. android动画效果 translate,Android利用translate、scale、alpha、rotate实现动画效果
  3. linux宏命令编辑,linux-vim宏定义(三)
  4. vue3绑定多个事件
  5. 使用HTML5 details,summary实现,展开,下拉,树的效果
  6. H5禁止手机自带键盘弹出
  7. Spring Boot 对CORS跨域访问的配置
  8. 基于Token进行身份验证
  9. 在电脑桌面 右键点击 计算机,在桌面上右键点击电脑
  10. 程序员需要关注的十个大数据技术