这个执行命令代码,好多看不懂,求解释下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#define oops(m) do{perror(m); exit(1);}while(0)
int main()
{
	char buf[32];
	int pid = 0;
	int num = 0;
	int i = 0;
	int flag = 0;
	char * p = NULL;
	while (1)
	{
		flag = 0;
		i = 0;
		num = 0;
		printf("Please input a cmd: ");
		fgets(buf, 32, stdin);	
		if (strncmp(buf, "end", 3) == 0)
			break;
		p = strstr(buf, "\n");
		if (p != NULL)
			*p = '\0';
		while (buf[i] != '\0')
		{
			if (buf[i] == ' ' && buf[i+1] != ' ')
			{
				num++;//这里不懂
				flag = 1;//还有这里,所谓的标记,是什么意思
			}
			else
				flag = 0;//???
			i++;
		}
		char* argv[num+2];// 为什么又是+2
		argv[num+1] = NULL;
		p = buf;
		for (i = 0; i < num+1; i++)
		{
			argv[i] = p;
			p = strstr(p, " ");
			if (p == NULL)
				break;
			while (*p == ' ' && *(p+1) == ' ')
			{   
				*p = '\0';
				p++;
			}   
			*p = '\0';
			p++;
		}
		
		pid = fork();
		if (pid == -1)
		{
			oops("fork");
		}
		else if (pid == 0)
		{
			execvp(argv[0], argv);
			perror("execvp");
		}
		wait(NULL);
	}
	return 0;
}
其他的都还懂
              
------解决方案--------------------num 表示有几个 命令参数
flag 下面没用到,没意义了
------解决方案--------------------if (buf[i] == ' ' && buf[i+1] != ' ')
{
num++;//这里不懂
flag = 1;//还有这里,所谓的标记,是什么意思
}
假如输入 a b c d,上面这句话就是  如果buf[i] 是空格,且 buf[i+1] 不是空格,则 num++,这样统计输入的 个数