作者和朋友建立的社区:非科班转码社区-CSDN社区云💖💛💙
期待hxd的支持哈🎉 🎉 🎉
最后是打鸡血环节:你只管努力,剩下的交给天意🚀 🚀 🚀
最近作者和好久建立了一个公众号
公众号介绍:
专注于自学编程领域。由USTC、WHU、SDU等高校学生、ACM竞赛选手、CSDN万粉博主、双非上岸BAT学长原创。分享业内资讯、硬核原创资源、职业规划等,和大家一起努力、成长。(二维码在文章底部哈!)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
using namespace std;
#define NUM 1024
#define SIZE 128
#define SEP " "
char commend_line[NUM];
char* commend_args[SIZE];
char env_buffer[128];
char pwd_buffer[128];
int ChangeDir(const char* new_path)
{
chdir(new_path);
return 0; //调用成功
}
void PutEnvInMyShell(char* new_env)
{
putenv(new_env);
}
int main()
{
//shell 本质上是一个死循环
while(1)
{
//1.显示提示符
getcwd(pwd_buffer,128);
printf("yuanlai45@Centos %s# ",pwd_buffer);
fflush(stdout);
//2.获取用户输入
memset(commend_line,'\0',sizeof(commend_line)*sizeof(char));
fgets(commend_line,NUM,stdin);//获取到的是c风格的字符串 '\0'结尾
commend_line[strlen(commend_line)-1]='\0';//清除\n
3.字符串分割
//"ls -a -l" -》 "ls" "-a" "-l"
commend_args[0]=strtok(commend_line,SEP);
int index=1;
//给 ls 添加颜色
if(strcmp(commend_args[0],"ls")==0)
{
commend_args[index++]=(char*)"--color=auto";
}
while(commend_args[index++]=strtok(NULL,SEP));
//4.内建命令
//因为我们是想改变父进程所处的工作目录,所以并不需要去创建子进程
if(strcmp(commend_args[0],"cd")==0 && commend_args[1]!=NULL)
{
ChangeDir(commend_args[1]);
continue;
}
//同理,我们想给父进程添加环境变量,已继承的方式去给子进程
if(strcmp(commend_args[0],"export")==0 && commend_args[1]!=NULL)
{
//目前我们环境变量的信息在commmand_line里面,每次都会被清空
//此处我们需要自己保存一下环境变量的内容
//binPutEnvInMyShell(commend_args[1]);
strcpy(env_buffer,commend_args[1]);
PutEnvInMyShell(env_buffer);
continue;
}
//5.创建进程,执行
pid_t id = fork();
if(id==0)//子进程
{
//6.程序替换
execvp(commend_args[0],commend_args);
exit(-1);//执行到这里说明子进程替换失败
}
int status = 0;
pid_t ret = waitpid(id,&status,0);//阻塞等待
if(ret>0)
{
printf("等待子进程成功,sig:%d,code:%d\n",status&0x7F,status&0xFF);
}
}
return 0;
}
最后的最后,创作不易,希望读者三连支持💖
赠人玫瑰,手有余香💖