shell的概念
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
fork
在Linux中,我们通常使用fork函数来为一个已经存在的进程创建一个新进程。而这个新创建出来的进程被称为原进程的子进程,原进程被称为该进程的父进程。
exec
exec 函数族提供了六种在进程中启动另一个程序的方法。exec 函数族的作用是根据指定的文件名或目录名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。
代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define FOUR_K 4096
#define ONE_K 1024
char USERNAME[32] = {"YCX"};//终端用户名
char commandbuf[FOUR_K] = {0};//4k缓冲区
char *Cmdbuff[10] = {0};
void ShowTerminal(void)
{
char tmpbuf[ONE_K] = {0};
char *show = NULL;
show = getcwd(tmpbuf,sizeof(tmpbuf));
printf("\33[1m\33[32m[Linux@%s]:\33[34m%s\33[0m$ ",USERNAME,show);
}
int GetCmd(char *cmd)
{
fgets(cmd, FOUR_K, stdin);
cmd[strlen(cmd) - 1] = '\0';
}
int AnalysisCmd(char *cmd)
{
int cnt = 0;
Cmdbuff[cnt] = strtok(cmd, " ");
if (NULL == Cmdbuff[cnt])
return 0;
cnt++;
while (NULL != (Cmdbuff[cnt] = strtok(NULL, " ")))
{
cnt++;
}
return cnt;
}
int MySystem(char **cmd)
{
pid_t pid;
pid = fork();
if (-1 == pid)
{
perror("fail to pid\n");
return -1;
}
if (0 == pid)
{
execvp(cmd[0], cmd);
exit(0);
}
else if (pid > 0)
{
wait(NULL);
}
}
int main(int argc, char const *argv[])
{
int counter = 0;
while (1)
{
ShowTerminal(); //终端显示
GetCmd(commandbuf); //接收命令
counter = AnalysisCmd(commandbuf); //解析命令
if(0 == strcmp("cd",Cmdbuff[0]))
{
chdir(Cmdbuff[1]);
continue;
}
else if (0 == strcmp("exit",Cmdbuff[0]))
{
return 0;
}
MySystem(Cmdbuff);
}
return 0;
}
运行如下,蓝色开头,紫色路径的为模拟shell