shell是什么?
shell是一个程序----打开一个终端运行的程序----命令解释行程序,运行在终端之上,捕捉用户的输入;然后决定要运行哪个shell命令程序
流程
-
捕捉键盘输入 scanf/gets
-
获取到键盘输入的数据 — [ ls -l -a ]
-
字符串格式解析 — 以空白字符作为间隔,分割成为一个个的字串, 去掉空白字符
char tmp[1024] = " ls -l -a";
char *ptr = tmp;
char *argv[32] = {NULL};
int argc = 0;
while(*ptr != ‘\0’){
if(*ptr != ’ '){
argv[argc] = pptr;
argc++;
while(*ptr != ’ ’ && *ptr != ‘\0’){
ptr++;
}
*ptr = ‘\0’;
}
ptr++;
} -
运行ls程序 — 让我们的shell程序创建一个子进程, 在子进程中进行程序替换, 替换为ls
-
创建子进程
-
程序替换
-
进程等待, 等待子进程退出
代码如下:
int main(int argc, char *argv[])
{
while(1){
printf("[shen]@localhost$ ");
fflush(stdout);
char tmp[1024] = {0};
gets(tmp);
//解析字符串
char *argv[32] = {NULL};
int argc = 0;//2.程序替换
char *ptr = tmp;
while(*ptr != '\0'){
if(!isspace(*ptr)){
argv[argc]= ptr;
argc++;
while(!isspace(*ptr) && *ptr != '\0')ptr++;
*ptr = '\0';
}
ptr++;
}
argv[argc]= NULL;
//运行argv[0]这个程序
//1.创建子进程
pid_t pid = fork();
if(pid < 0){
perror("fork error");
return -1;
}
else if(pid == 0){
//2.程序替换
execvp(argv[0], argv);
exit(0);//替换失败则直接退出
}
wait(NULL);//等待子进程退出
}
return 0;
}
此程序用了int isspace(int c); 从手册查到:
checks for white-space characters. In the “C” and “POSIX” locales,
these are: space, form-feed (’\f’), newline (’\n’), carriage return
(’\r’), horizontal tab (’\t’), and vertical tab (’\v’).
头文件为:#include <ctype.h>