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; } 里面用到了很多的系统函数的调用,没有细细的解释说明,留给大家自学啦,哈哈!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值