Minishell
一、项目背景
在linux操作系统中,用户对操作系统进行的一系列操作都不能直接操作内核,而是通过shell间接对内核进行操作。
Shell 是操作系统中的一种程序,它为用户提供了一种与操作系统内核和计算机硬件进行交互的界面。用户可以通过 Shell 输入命令来执行各种任务,如文件管理、程序执行和系统配置等。
此次目标是自己编写一个minishell程序,可以完成shell的的基础功能。
二、项目实现
- 完成minishell界面设计
- 从终端接收用户输入的命令
- 调用函数实现用户命令
三、代码
terminal.c
#include"terminal.h"
#include <unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/wait.h>
void show_usr_term_line()
{
char buff[512] = {0};
char path[128] = {0};
getcwd(path,sizeof(path)); //获取当前工作目录的绝对路径
sprintf(buff,"linux@Ubuntu:%s$ ",path);
printf("%s",buff);
return;
}
int get_usr_cmd(char *buff,int len)//读取用户命令
{
/*
fgets(buff,sizeof(buff),stdin);
形参是实参的拷贝,这里的buff是个指针,占8个字节
*/
fgets(buff,len,stdin);
buff[strlen(buff) - 1] = '\0';
return 0;
}
int parse_usr_cmd(char * cmd_buf, char *arg[])//解析用户命令
{
int i = 0;
arg[i] = strtok(cmd_buf," ");
while(arg[i] != NULL)
{
i++;
arg[i] = strtok(NULL," ");
}
return i;
}
void exec_usr_cmd(char *arg[],int cmd_cnt)//执行用户命令
{
pid_t pid = fork();
if(pid > 0)
{
wait(NULL);
}
else if (0 == pid)
{
execvp(arg[0],arg);
printf("fail exec");
}
else
{
printf("fail fork");
}
}
main.c
#include<stdio.h>
#include"terminal.h"
#include<string.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
char cmd_buff[CMD_MAX_LEN] = {0};
char *arg[CMD_MAX_CNT] = {NULL};
int cmd_cnt = 0;
while(1)
{
show_usr_term_line();
get_usr_cmd(cmd_buff,CMD_MAX_LEN);
cmd_cnt = parse_usr_cmd(cmd_buff,arg);
if(!strcmp(arg[0],"exit"))//退出minishell
{
break;
}
else if (!strcmp(arg[0],"cd"))//execvp不包含cd命令
{
chdir(arg[1]);//更改工作路径
continue;
}
exec_usr_cmd(arg,cmd_cnt);
}
return 0;
}
terminal.h
#ifndef __TERMINAL_H__
#define __TERMINAL_H__
#define CMD_MAX_LEN 512
#define CMD_MAX_CNT 10//用户命令字段
extern void show_usr_term_line();
extern int get_usr_cmd();
extern int parse_usr_cmd(char * cmd_buf, char *arg[]);
extern void exec_usr_cmd(char *arg[],int cmd_cnt);
#endif
使用makefile管理工程文件
Makefile
DST=app
SRC=main.c terminal.c
CC=gcc
$(DST):$(SRC)
$(CC) $^ -o $@
clean:
rm $(DST)