char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
char *strtok(char *str, const char *delim)
分解字符串 str 为一组字符串,delim 为分隔符。
/* 获取第一个子字符串 */
token = strtok(str, s);
/* 继续获取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
chdir函数: int chdir(const char *path);
命令提示符那一栏可以通过相关函数获得。
#include
#include
#include
#include
#include
#include
#define NUM 128
#define SIZE 32
char command_line[NUM];
char *command_parse[SIZE];
int main()
{
while(1){
memset(command_line, '\0', sizeof(command_line));
printf("[whb@myhost 我的shell]$ ");
fflush(stdout);
//1. 数据读取
if(fgets(command_line, NUM-1, stdin)){
command_line[strlen(command_line) - 1] = '\0';
//ls -a -l -i
//2. 字符串(命令行数据分析)
int index = 0;
command_parse[index] = strtok(command_line, " ");
while(1){
index++;
command_parse[index] = strtok(NULL, " ");
if(command_parse[index] == NULL){
break;
}
}
//3. 判断命令 //a. 内置命令 //b. 第三方命令
if(strcmp(command_parse[0], "cd") == 0 && chdir(command_parse[1]) == 0){
continue;
}
// 执行非内置命令
if(fork() == 0){
//子进程
execvp(command_parse[0], command_parse); // ls ls -a -i -l
exit(1);
}
int status = 0;
pid_t ret = waitpid(-1, &status, 0);
if(ret > 0 && WIFEXITED(status)){
printf("Exit Code: %d\n", WEXITSTATUS(status));
}
}
}
return 0;
}