- /***********************************************************************
- * File : shellcom.c
- * Desc : 实现类似bash的Linux命令行解释器功能。
- **********************************************************************/
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- int main(void)
- {
- char dirname[80];
- int i=0;
- char cmdstr[255];
- int argc=0;
- int g;
- int ch;
- int pid;
- char *p;
- char *argv[10];
- FILE *fp;
- while(1)
- {
- argc=0;
- for(i=0;i<10;i++)
- {
- argv[i]=NULL;
- }
- memset(cmdstr,0,255);
- getcwd(dirname,80); //获得当前路径名
- printf("CMD shell:%s",dirname);
- gets(cmdstr); //获得输入的命令行
- fp=fopen("history","a+"); //存入历史文件
- fputs(cmdstr,fp);
- fputc('\\n',fp);
- fclose(fp);
- p=strtok(cmdstr," "); //根据空格分开,并获得头指令
- while(p&&argc<10)
- {
- argv[argc]=p;
- p=strtok(NULL," ");
- argc++;
- }
- if(argc<10){
- argv[argc]=NULL;
- }
- if (strcmp(argv[0],"exit")==0) //退出
- {
- wait(NULL);
- exit(0);
- }
- if (strcmp(argv[0],"cd")==0)
- {
- g=chdir(argv[1]);
- if(g<0){
- perror("");
- }
- }
- if (strcmp(argv[0],"history")==0)
- {
- fp=fopen("history","r");
- while((ch=fgetc(fp))!=EOF)
- {
- printf("%c",ch);
- }
- fclose(fp);
- continue;
- }
- else
- {
- pid = fork();
- if (pid==0)
- {
- g=execvp(argv[0],argv);
- if (g==-1){
- printf("command is not found.\\n");
- }
- }
- }
- }
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/191220138138.html
来源: http://www.codesnippet.cn/detail/191220138138.html