前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++ Linux的老铁 主要内容含:
ifn<=0,直接结束省的创建子进程
cd就不行。因为是子进程的cd…
getUserCommand函数
commandSplit函数
execute函数
usercommand
argv
#define NUM 1024
#define SIZE 64
int main()
{
while(1){ //shell要不停跑,死循环
char usercommand[NUM];
char *argv[SIZE];
// 1. 打印提示符&&获取用户命令字符串获取成功
int n= getUserCommand(usercommand, sizeof(usercommand));
// 2. 分割字符串
// "ls -a -l" -> "ls" "-a" "-l"
commandSplit(usercommand, argv);
// 3. 执行对应的命令
execute(argv);
}
}
getUserCommand函数
中统一打印getenv函数
可以获取 环境变量的地址,进而打印行获取接口fgets
\n
——导致执行结果和shell之间出现空行;所以我们在输入完后要把command最后一个字符'\n'
换成'\0'
int getUserCommand(char *command, int num)
{
printf("[%s@%s %s]# ", getUsername(), getHostname(), getCwd());
char *r = fgets(command, num, stdin); // 最终你还是会输入\n
if(r == NULL) return -1;
// "abcd\n" "\n"
command[strlen(command) - 1] = '\0'; // 有没有可能越界?不会
return strlen(command);
}
char *homepath()
{
char *home = getenv("HOME");
if(home) return home;
else return (char*)".";
}
const char *getUsername()
{
const char *name = getenv("USER");
if(name) return name;
else return "none";
}
const char *getHostname()
{
const char *hostname = getenv("HOSTNAME");
if(hostname) return hostname;
else return "none";
}
strstok函数
分割; 注意语法,分成首次分割,和剩余分割
#define SEP " "
void commandSplit(char *in, char *out[])
{
int argc = 0;
out[argc++] = strtok(in, SEP);
while( out[argc++] = strtok(NULL, SEP));
}
我们回顾原理部分:
于是我们设计出:
fork函数
创建子进程execvp函数
,用到 分割usercommand数组后的字符串的地址——的指针数组argv1. fork函数:
2. execvp函数: 由于我们用到了指针数组argv,所以用exec系列的vp尾缀,execvp , 表示v(vector)数组,p(可以使用环境变量PATH,无需写全路径)
3. waitpid函数:不关心后续操作,status参数设置成NULL,options参数设置成0
int execute(char *argv[])
{
pid_t id = fork();
if(id < 0) return -1;
else if(id == 0) //child
{
// exec command
execvp(argv[0], argv); // cd ..
exit(1);
}
else // father
{
int status = 0;
pid_t rid = waitpid(id, NULL, 0);
}
return 0;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有