shell处理流程:
1.获取标准输入 2.对输入字符串进行解析(获取程序名称+参数) 3.创建子进程 :程序替换-程序名称
4.进程等待
写一个shell,需要循环以下过程:
- 获取命令行
- 解析命令行
- 建立一个子进程(fork)
- 替换子进程(execvp)
- 父进程等待子进程退出
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
while(1){
printf("[koala@localhost]#");
fflush(stdout);
//获取命令行
char buf[1024];
if(scanf("%[^\n]%*c",buf)!=1)//知道输入换行结束并忽略其后所有的字符{
getchar();
}
char *agrv[32];
int argc = 0;
char *ptr = buf;
//解析命令行
while(*ptr!='\0'){
if(!isspace(*ptr)){
argv[argc++] = ptr;
while(!isspace(*ptr)&&*ptr!='\0'){
ptr++;
}
}else{
*ptr = '\0';
ptr++;
}
}
argv[agrc]=NULL;
//建立一个子进程
int pid = fork();
if(pid<0){
exit(-1);
}else if(pid==0){
//替换子进程
execvp(argv[0],argv);
exit(0);
}
//父进程等待子进程退出
wait(NULL);
}
return 0;
}