简单的minishell

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:

  1. 减少文件的读写次数(物理读写)。
  2. 缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数。

5. 动态缓冲区

Windows下一般默认缓冲区在C盘,所以C盘一定要预留够足够大的空间。

原因: 由于用户对硬盘分区的频繁读写操作,造成磁盘碎片的增多,那么硬盘分区的连续空间不断减少,动态缓冲区的空间相应的减少,数据的保护效果也会受到影响。

保护措施:

  1. 系统盘里的程序和文件在不断增加, 恢复或保存把动态缓冲区释放掉
  2. 系统在工作时会产生大量的垃圾文件<建议定期清除>
  3. 可能把一些软件装到系统盘<建议D盘、E盘>
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值