shell:
- 在linux下,作为操作系统的linux是一个核心(kernel),但是作为一般用户的我们是不能和直接使用这个核心的,而是通过核心的“外壳”程序,也就是所谓shell,Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
- shell最简单的定义就是:命令行解释器(command Interpreter)
- 将使用的命令翻译给核心处理;
- 同时,将核心的处理结果翻译给使用者。
Linux下的两种用户:
- 超级用户:可以在Linux下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
shell的运行过程原理:
1、从命令行上将你的信息拿到
2、作分析处理
3、fork创建子进程,让子进程去替换执行,父进程等
4、下一次重复就行了
实现一个简单的shell:
1.获取命令行;
2.解析命令行;
3.建立一个子进程(fork);
4.替换子进程(execvp);
5.父进程等待子进程退出(wait)。
minishell.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
#define NUM 32
int main()
{
char cmd[MAX];
char *myargv[NUM];
for(;;)
{
printf("[win@localhost haha]# ");
fflush(stdout);
fgets(cmd, MAX, stdin);
cmd[strlen(cmd) - 1] = 0;
int i = 0;
myargv[i] = strtok(cmd, " ");
i++;
while(i)
{
char *p = strtok(NULL, " ");
if(p == NULL)
{
myargv[i] = NULL;
break;
}
myargv[i] = p;
i++;
}
pid_t id = fork();
if(id < 0)
{
}
else if(id == 0)
{
//child
execvp(myargv[0], myargv);
}
else
{
waitpid(id, NULL, 0);
}
}
//for(i = 0;myargv[i] != NULL; i++)
//{
// printf("%d: %s\n", i, myargv[i]);
//}
return 0;
}