#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <sys/wait.h>
#include <pwd.h>
//自定义路径地址
#define PATH "/home/tr"
//打印提示信息
void printinfo()
{
int uid = getuid();
char *t = "$";
if(uid == 0)
{
t = "#";
}
//获取用户名
struct passwd *ptr = getpwuid(uid);
if(ptr == NULL)
{
printf("[mybash]$");
fflush(stdout);
return;
}
//获取主机名
char hostname[128] = {0};
gethostname(hostname,128);
//获得当前路径
char path[256] = {0};
getcwd(path,256);
char *dir = "/";
char *s = strtok(path,"/");
while(s != NULL)
{
dir = s;
s = strtok(NULL,"/");
}
printf("[%s@%s %s]%s",ptr->pw_name,hostname,dir,t);
fflush(stdout);
}
int main()
{
while(1)
{
//printf("Mybash-->");
//fflush(stdout);
printinfo();
char buff[128] = {0};
fgets(buff, 128, stdin);
buff[strlen(buff)-1] = '\0';
//myargv储存从buff中取出的字串
char *myargv[10] = {0};
//若buff为空,函数不执行
char *s = strtok(buff, " ");
int i = 0;
while(s != NULL)
{
myargv[i++] = s;
s = strtok(NULL, " ");//函数内含静态指针保存读取位置
}
//内置命令实现
if(strlen(buff) == 0 ) continue;
if(strcmp(myargv[0], "exit") == 0) exit(0);
if(strcmp(myargv[0],"cd") == 0)
{
if(myargv[1] != NULL)
{
chdir(myargv[1]);
}
continue;
}
//fork+exec实现命令
pid_t pid = fork();
if(pid == -1) continue;
if(pid == 0)
{
//自定义调用位置
char path[256] = {0};
//忽略 ./ / 开头的输入
if(strncmp(myargv[0],"./",2) != 0 && strncmp(myargv[0],"/",1) != 0)
{
strcpy(path,PATH);
}
strcat(path,myargv[0]);
execv(path,myargv);
perror("execlp error");
exit(0);
}
wait(NULL);
}
}
Linux C 编程 | 简单的bash命令解释器实现
最新推荐文章于 2024-03-19 10:22:12 发布