1. 分析与思路
1.获取键盘输入2.解析输入信息(命令名称+运行参数)
3.创建子进程
4.在子进程中进行程序替换(替换失败退出子进程)
5.父进程进行进程等待(避免子进程成为僵尸进程)
2. 代码实现
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<ctype.h>
int main(int argc, char* argv[])
{
while (1){
printf("[user@host path]$ ");
fflush(stdout);
//给定一个存放命令的空间
char cmd[1024] = { 0 };
fgets(cmd, 1023, stdin);
//将最后一个字符替换为'\0'
cmd[strlen(cmd) - 1] = '\0';
char *ptr = cmd;
char* myargv[32] = { NULL };
int myargc = 0;
//[ ls -a ]
while (*ptr!='\0')
{
if (!isspace(*ptr))//判断是否为空格
{
argv[myargc] = ptr;
myargc++;
while (*ptr != '\0'&&!isspace(*ptr)) ptr++;
*ptr = '\0';
}
ptr++;
}
myargv[myargc] = NULL;
if (strcmp(myargv[0], "cd") == 0)
{
chdir(myargv[1]);
continue;
}
pid_t pid = fork();
if (pid<0)
{
continue;
}
else if (pid == 0)
{
execvp(myargv[0], myargv);
exit(-1);
}
wait(NULL);
}
return 0;
}
3. 命令解析
char *fgets(char *s,int size,FILE*stream);
//*s: 给定的空间,缓冲区
//size: 获取的数据大小,(数据不可以大于给定的空间,防止越界)
//FILE*stream: 文件流指针
isspace(*ptr); //检测一个空白字符;
Linux中关于isspace的解释:
检查空白字符。 在“C”和“POSIX”区域中,它们是:
空格(space)
换页(‘\f’)
换行(‘\n’)
回车(‘\r’)
水平制表符(‘\t’)
和垂直制表符(‘\v’)
4. 缓冲区
缓冲区(Buffer):内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间称之为缓冲区。
Merits:
- 减少文件的读写次数(物理读写)。
- 缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数。
5. 动态缓冲区
Windows下一般默认缓冲区在C盘,所以C盘一定要预留够足够大的空间。
原因: 由于用户对硬盘分区的频繁读写操作,造成磁盘碎片的增多,那么硬盘分区的连续空间不断减少,动态缓冲区的空间相应的减少,数据的保护效果也会受到影响。
保护措施:
- 系统盘里的程序和文件在不断增加, 恢复或保存把动态缓冲区释放掉
- 系统在工作时会产生大量的垃圾文件<建议定期清除>
- 可能把一些软件装到系统盘<建议D盘、E盘>