📄 shell.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/wait.h>#define MAX 4096void Fun( char *, char ** );main(){ int pid; //进程pid int status; char *p=0; //指针,用来存储获取到的用户名 char buf[MAX]; //存储通过键盘输入的信息 char *args[64]; //指针数组,分析命令行参数 char f[MAX]; //缓冲区,用来存储路径信息 printf("[%s %s]#", p, f); //输出命令行标识:用户主目录,当前路径,和标识符 while ( fgets( buf, MAX, stdin ) != NULL ) //从键盘获取信息存入buf中 { /*if ( strcmp( *args, "pwd" ) == 0 ) { if ( (p = getenv("USER")) ) printf("%s\n", p); }*/ if ( buf[strlen(buf) - 1] == '\n' ) { buf[strlen(buf) - 1] = '\0'; } Fun( buf, args ); if ( strcmp( *args, "cd" ) == 0 ) //判断是否为cd { if ( *( args + 1 ) == NULL ) //判断cd后是否有路径 { p = getenv("USER"); //获取该用户名称 strcpy(f, p); } else { *args = *( args + 1 ); //如果cd后有路径信息,则改变到该路径 chdir( *args ); getcwd( f, sizeof(f) ); //将路径存到缓冲区f中 } } if ( (pid = fork()) < 0 ) { printf("fork error!\n"); exit(0); } if ( pid == 0 ) //子进程 { if ( ( strcmp( *args, "exit" ) == 0 ) || ( strcmp( *args, "logout" ) == 0 ) ) //判断是否为exit { exit(0); } if ( strcmp( *args, "pwd" ) == 0 ) //若输入pwd,则将缓冲区f中的内容输出 { printf("%s\n", f); exit(0); } if ( strcmp( *args, "cd" ) == 0 ) //如果命令为cd,则退出,不执行,exec函数 { exit(0); } else { execvp ( *args, args ); //printf("no this comment!\n"); exit(0); } } else { waitpid( pid, &status, 0 ); if ( ( strcmp( *args, "exit" ) == 0 ) || ( strcmp( *args, "logout" ) == 0 ) ) //若为exit,子进程退出,然后父进程退出 { exit(0); } } printf("[%s %s]#", p, f); }}void Fun( char *buf, char *args[] ){ while ( *buf != '\0' ) //判断你输入的信息是否为空 { while ( (*buf == ' ') || (*buf == '\t') || (*buf == '\n') ) //当你输入的信息有空格,制表符,换行符时 { *buf++ = '\0'; //则将该字符串的结尾处添为“\0” } *args++ = buf; //将该字符串赋给指针数组,然后指针下移 while ( (*buf != '\0') && (*buf != ' ') && (*buf != '\t') && (*buf != '\n') ) { buf++; //buf就为你输入的字符串的下一个子串 } } *args = '\0';}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -