日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2023/12/20 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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功能实现!...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。