linux 简单Shell程序设计,利用linux下的c语言编程来简单的实现一个shell功能实现!...
學(xué)習(xí)了fork(),exec()函數(shù)之后,讓我們來簡單是實現(xiàn)來實現(xiàn)一個shell
里面用到了一些函數(shù),進行對字符串進行做一下簡單的處理!
#include
#include
#include
#include
#include
#include
#include
#include
#define NUM 1024
#define SIZE 50
int? mystrtok(char *argv[],char *string);
//這個函數(shù)做的是對字符串的分割,把命令分割開,用到了字符串的分割函數(shù)
int mystrtok(char *argv[],char *string)
{
int i=0;
char delim[]=" ";
char *p;
argv[0]=strtok(string,delim);//字符串分割函數(shù)的使用
//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");//調(diào)用getenv函數(shù),來獲得shell命令的提示中的用戶名
strcpy(buffer,username);
strcat(buffer,"@");
id=gethostname(buf1,sizeof buf1);//調(diào)用此函數(shù)來獲取shell命令的提示中的主機名
p=strtok(buf1,delim);//對主機進行截取
strcat(buffer,p);//字符串的連接函數(shù)
ptr=strrchr(buf2,'/');//字符串的從后往前進行截取的函數(shù),講多得shell命令提示中的路徑
//比較字符串,判斷用戶的路徑是在"/","~",還是其他當(dāng)中
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");
//當(dāng)前用戶是root用戶還是普通用戶,通過字符串的比較,如果是root,則返回0;
if((strcmp(string,"root"))==0)
{
j=0;
}
while(1){
//通過調(diào)用上面自定義的getusername()函數(shù),來得到shell命令中的提示
printf("[%s]",getusername(buffer));
//判斷是使用root的提示#,還是其他用戶的$
if(j==0)
{
printf("# ");
}
else
{
printf("$ ");
}
//字符串的輸入,要用gets函數(shù)或者用fgets函數(shù),因為scanf函數(shù)把空格看成字符串的結(jié)束
gets(str);
//調(diào)用字符串的分割函數(shù),獲得要截取出來的命令和命令參數(shù),例如:ls -a分別放到argv[0],argv[1]中
status=mystrtok(argv,str);
if(status!=0)
{
printf("fail to getargv!\n");
}
//通過fork()函數(shù)來創(chuàng)建一個父進程和一個子進程
pid=fork();
if(-1==pid)
{
printf("your fork failed!\n");
}
else if(pid==0)
{
//子進程用來對shell命令進程進程解釋執(zhí)行的
if(argv[1]!=NULL)
{
execvp(argv[0],argv);
}
else if(argv[1]==NULL)
{
execlp(argv[0],argv[0],NULL,NULL);
}
}
else
{
//父進程用來等待子進程的結(jié)束,然后再循環(huán)輸入shell命令 ???if(wait(&status)==-1) ???{ ????printf("wait failed!\n"); ????exit(1); ???} ?? ??} ?} ?return 0; } 里面用到了很多的系統(tǒng)函數(shù)的調(diào)用,沒有細細的解釋說明,留給大家自學(xué)啦,哈哈!!
總結(jié)
以上是生活随笔為你收集整理的linux 简单Shell程序设计,利用linux下的c语言编程来简单的实现一个shell功能实现!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux sed i 大文件,sed
- 下一篇: linux不同发行版 程序通用吗,为什么