实现一个minishell(经验+3 ↑)
命令行解释器(本质就是一个程序),功能是将用户所要进行的操作传递给内核。
首先我们需要知道命令行开头的内容是啥。
为了区别系统的shell,我将自己写的用户名改为“ljl1”;
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/wait.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
while(1)
{
char buf[1024] = {0};
printf("[ljl1@VM-0-5-centos Shell]$ ");
fflush(stdout);//手动刷新缓冲区
fgets(buf,1023,stdin);//从标准输入中读取1023个字节到buf中,留一个字节放\0
buf[strlen(buf)-1] = '\0';
char *str = buf;
int redirect_flag = 0;//1-清空,2-追加重定向;
char *redirect_file = NULL;
while(*str != '\0')
{
if(*str == '>')
{
redirect_flag = 1;
*str = '\0';
str++;
if(*str == '>')
{
redirect_flag = 2;
str++;
}
while(*str != '\0' && *str == ' ')
str++;
redirect_file = str;
while(*str != '\0' && *str != ' ')
str++;
*str = '\0';
}
str++;
}
char *ptr = buf;
char myargv[32][32] = {{0}};
int myargc = 0;
while(*ptr != '\0')
{
if(!isspace(*ptr))
{
int count = 0;
while(!isspace(*ptr) && *ptr != '\0')
{
myargv[myargc][count] = *ptr;
count++;
ptr++;
}
myargc++;
}
ptr++;
}
char* arg[32] = {NULL};
int i = 0;
for(i = 0;i<myargc;++i)
{
arg[i] = myargv[i];
}
arg[myargc] = NULL;
pid_t pid = fork();
if(pid < 0)
continue;
else if(pid == 0)
{
if(redirect_flag == 1)
{
int fd = open(redirect_file, O_CREAT|O_TRUNC|O_WRONLY,0664);
dup2(fd,1);
}
else if(redirect_flag == 2)
{
int fd = open(redirect_file,O_CREAT|O_APPEND|O_WRONLY,0664);
dup2(fd,1);
}
execvp(arg[0],arg);
exit(-1);
}
wait(NULL);
}
return 0;
}
走起~
完成。
12月25日消息 外媒 MSPoweruser 报道,谷歌的 Project Zero 团队发布了 Windows ...
本文先介绍一款通用脚手架yeoman的基本使用然后再利用node.js来开发一个自己的脚...
MySQL索引必问面试题 1. 什么是索引 2. 索引分类 3. 索引的基本操作 主键索引的...
本文转载自微信公众号「真没什么逻辑」,作者 Draveness 。转载本文请联系真没什...
前提 win 系统安装植物大战僵尸这里有一个百度云网盘是从网上找的我用了应该没有...
本文介绍 MySQL 和 PostgreSQL 的一些特性对比,让大家了解二者的优劣,更好的做...
1) a href= 'JavaScript :history.back(1)'『返回上一页』/a 2) a href='window....
本文转载自微信公众号「猿天地」,作者尹吉欢 。转载本文请联系猿天地公众号。 ...
HAProxy搭建Web群集 HAProxy介绍 HAProxy功能 三大软件负载均衡器对比(LVS Nginx...
文章目录 一、文件的基础知识 1.什么是文件 2.文件名 3.文件类型 4.文件指针 二...