流程
1.捕捉用户键盘输入 [ ls -a -l]
2.解析输入信息—得到命令名称,运行参数 [ls] [-a] [-l]
3.创建子进程,在子进程通过命令名称进行程序替换(让子进程运行命令)
4.进程等待,等待子进程退出,防止出现僵尸进程
#include<stdio.h> //printf
#include<stdlib.h> //exit
#include<unistd.h> //fork
#include<sys/wait.h> //wait
#include<string.h> //strcmp
#include<ctype.h> //isspace
int main(int argc,char* argv[]) //运行参数个数 运行参数字符串首地址
{
while(1)
{
//1.在命令行输入[ls -a -l]
printf("[users@host path]$");
fflush(stdout); //刷新缓存区
char cmd[1024]={0}; //存储命令行数据
fgets(cmd,1023,stdin); //从标准输入中读取1023个字节存储到cmd中
cmd[strlen(cmd)-1]='\0'; //将换行符改为转义字符'\0'(空字符) 原因:fgets默认换行
printf("cmd:[%s]\n",cmd);
//2.解析命令行数据 [ls] [-a] [-l]
char *ptr=cmd; //读取命令行输入数据
char *arg[32]={NULL}; //指针数组:存放着其对应字符串的首地址。
int num=0;
while(*ptr!='\0') //命令行没有读取到最后一行的'\0',就继续循环
{
if(isspace(*ptr)==0) //判断是否是空格字符
{
arg[num]=ptr; //存储字符ls
num++;
while(*ptr!='\0'&&!isspace(*ptr)) ptr++; //ls后面的空格处
*ptr='\0'; //空格为‘\0’
}
ptr++; //运行到下一个字符处
}
arg[num]=NULL; //最后一个字符为空,是函数替换需要
if(!strcmp(arg[0],"cd")){ //strcmp比较字符串大小 arg[0]=cd
chdir(arg[1]); //chdir更改工作目录
continue;
}
//3.创建子进程,在子进程通过命令名称进行程序替换(让子进程进行命令)
pid_t pid=fork(); //创建子进程
if(pid<0){
continue; //继续获取下一个命令
}else if(pid==0) //子进程创建成功
{
execvp(arg[0],arg);
exit(-1); //退出子进程
}
wait(NULL); //阻塞父进程,直至子进程退出 防止僵尸进程
}
}