linux 简单Shell程序设计,利用linux下的c语言编程来简单的实现一个shell功能实现!...
学习了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功能实现!...相关推荐
- linux进程创建心得体会,Linux系统下计算机C语言编程心得体会
摘 要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...
- 实验linux下的编程,实验四 Linux下的C语言编程;
<实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...
- linux下的c语言编程实验4,实验四-Linux下的C语言编程
实验四Linux 下的 C 语言编程 四.实验内容 本实验要求在LINUX/UNIX环境下用C语言编写三个具体的SHELL命令,基本涉及了LINUX/UNIX文件系统中较为常用的有关文件操作的系统调用 ...
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
- 在linux下用c语言编程软件下载,在Linux下进行C语言编程
在Linux下进行C语言编程 在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC快速入门 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] ...
- linux下c语言读取docx,Linux下的C语言编程.docx
电子商务09-01 王荣宝 540913120138 Linux下的C语言编程 1 gdb调试和gcc编程综合实例 1.1 新建文件test.c,文件内容如下图所示: List列出程序源代码 本程序作 ...
- 操作系统实验六:Linux下的C语言编程
实验六 Linux下的C语言编程 一.实验要求 (1)熟悉Linux环境下C语言应用程序开发的基本过程: (2)熟悉基本库函数的使用: (3)具有初步的应用程序设计能力. 二.实验内容 (1)有三个程 ...
- c语言编程文章排版,一种简单英文词典排版系统的实现 C语言编程
一种简单英文词典排版系统的实现 C语言编程 答案:2 信息版本:手机版 解决时间 2019-10-06 18:43 已解决 2019-10-06 03:21 1. 一种简单的英语词典排版系统的实现 ...
- 用linux下的C语言编程万年历,shell编程万年历月历和对应c语言程序.docx
shell编程万年历月历和对应c语言程序.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网 ...
最新文章
- NTFS for Mac OS X:使用Brew安裝NTFS-3G
- java中等待所有线程都执行结束
- Java:Comparable接口
- 【杂谈】如何在专家指导下系统性学习自然语言处理
- 【玩转cocos2d-x之三十】点九图和输入框的使用
- 【转】HashSet的用法
- Java面试之synchronized和Lock有什么区别?
- android组件化数据生命周期,Android组件化开发实践(七):开发常见问题及解决方案...
- 浏览器CSS hack整理
- 新概念单片机c语言 pdf,新概念51单片机C语言教程实例代码(1).pdf
- 制作微软引导盘实现装系统0失败uefi启动MediaCreationTool
- 测试用例和缺陷报告模板
- 社交仅发送图片和视频 -设计测试用例
- SQL计算每天的期初、入库、出库、结存数
- ACL国际计算机语言协会2019,干货 | 2019 AI 国际顶级学术会议一览表
- 怎么快速修改gif尺寸?仅需三步教你改gif大小
- 0085 开头的电话拦截方法(小米手机有效)
- STVD 编译提示 #error clnk :1 missing output file 的问题
- http协议_代理服务(proxy)
- Numpy攻略系列:repeat函数