亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shell.cpp

?? Linux shell實現,包括管道
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	real_order[i]='\0';
	i++;
	if(flag_out==1&&input[i]=='>')
	{
		flag_out=2;
		i++;
	}
	else if (flag_in==1&&input[i]=='<')
	{
		flag_in=2;
		i++;
	}
	//讀出前面的空格
	while ((input[i]==' '||input[i]=='	')&&i<len)
		i++;
	j=0;
	out_filename[0]='\0';
	in_filename[0]='\0';
	//讀取定向輸入或輸出的文件
	if(flag_out>0)
	{	
		while (i<=len)
		{
			if(input[i]=='<')
			{
				out_filename[j]='\0';
				break;
			}
			out_filename[j]=input[i];
			i++;
			j++;
		}
	}
	if(flag_in>0)
		while (i<=len)
		{
			if (input[i]=='>')
			{
				in_filename[j]='\0';
				break;
			}
			in_filename[j]=input[i];
			i++;
			j++;
		}
	//既存在輸出重定向也存在輸入重定向
	if (i<len)
	{
		j=0;
		if (flag_out>0&&input[i]=='<')
		{
			i++;
			flag_in=1;
			if(input[i]=='>')
			{
				flag_in=2;
				i++;
			}
			//讀出前面的空格
			while ((input[i]==' '||input[i]=='	')&&i<len)
				i++;
			while (i<=len)
			{
				in_filename[j]=input[i];
				i++;
				j++;
			}
		}
		else if (flag_in>0&&input[i]=='>')
		{
			i++;
			flag_out=1;
			if(input[i]=='>')
			{
				flag_out=2;
				i++;
			}
			//讀出前面的空格
			while ((input[i]==' '||input[i]=='	')&&i<len)
				i++;
			while (i<=len)
			{
				out_filename[j]=input[i];
				i++;
				j++;
			}
		}
		else
		{
			fprintf(stderr,"ERROR!can't find the file!\n");
			return -1;
		}
	}
	
	//for debug
	/*printf("real_order: %s\n",real_order);
	printf("out_filename: %s\n",out_filename);
	printf("in_filename: %s\n",in_filename);*/

	k=number(real_order);
	analized_order=analize(real_order);//命令已經保存在*analized_order[]中
	if(strcmp(analized_order[0], "leave") == 0) //退出命令
	{
		printf("bye-bye\n");
		// 釋放申請的空間
		for(i=0;i<k;i++)
			free(analized_order[i]);
		free(analized_order);
		free(real_order);
		exit(1);
		return 1;
	}

	/*如果輸入的是cd命令*/
	if (strcmp(analized_order[0],"cd")==0)
	{
		do_cd(analized_order);
		// 釋放申請的空間
		for(i=0;i<k;i++)
			free(analized_order[i]);
		free(analized_order);
		free(real_order);
		return 1;
	}
	order_path=is_file_exist(analized_order[0]);
	if(order_path==NULL)	//can't find the order
	{
		fprintf(stderr,"This is command is not founded ?!\n");
		// 釋放申請的空間
		for(i=0;i<k;i++)
			free(analized_order[i]);
		free(analized_order);
		free(real_order);
		return -1;
	}
		//創建子進程用于執行命令
	if((pid = fork()) == 0) 
	{
		/* 存在輸出輸入重定向*/
	    if(flag_out==1)
			fd_out = open(out_filename,O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
		if(flag_out==2)
			fd_out = open(out_filename, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR );
		if(flag_in==1)
			fd_in = open(in_filename, O_RDONLY, S_IRUSR|S_IWUSR );
		if(flag_in==2)
			fd_in = open(in_filename, O_RDONLY, S_IRUSR|S_IWUSR );
        if(fd_out==-1) 
		{
			printf("Open out %s error \n", out_filename);
			return -1;
		}
		if(fd_in==-1) 
		{
			fprintf(stderr,"Open in %s error \n", in_filename);
			return -1;
		}
		  //使用dup2函數將標準輸出重定向到fd_out上
		if(flag_out>0)
			if(dup2(fd_out, STDOUT_FILENO) == -1)
			{
				fprintf(stderr,"Redirect Standard Out Error !\n");
				exit(1);
			}
		  //使用dup2函數將標準輸入重定向到fd_in上
		if(flag_in>0)
			if (dup2(fd_in,STDIN_FILENO)==-1)
			{
				fprintf(stderr,"Redirect Standard Out Error !\n");
				exit(1);
			}
		execv(order_path,analized_order);
		exit(1);		//子進程推出
	}
	else                     //父進程
	if(back==0)        // 并非后臺執行指令
		pid=waitpid(pid, &status, 0);
	// 釋放申請的空間
	free(out_filename);
	free(in_filename);
	free(order_path);
	for(i=0;i<k;i++)   
		free(analized_order[i]);
	free(analized_order);
	return 1;
}
int is_back(char *order)	//分析是否為后臺進程,并且將字符&去掉
{
	int len=strlen(order);
	if(order[len]=='&')
	{
		order[len]='\0';
		return 1;
	}
	else return 0;
}
char *is_file_exist(const char *order)		//判斷命令是否存在
{
	char * path, * p;
	char *buffer;
	int i,max_length;
	i = 0;
	/* 使用getenv函數來獲取系統環境變量,用參數PATH表示獲取路徑*/
	path=getenv("PATH");
	p=path;
	max_length=strlen(path)+strlen(order)+2;
	if((buffer=(char *)malloc(max_length*(sizeof(char))))==0)
	{
		fprintf(stderr,"error! can't malloc enough space for buffer\n");
		return NULL;
	}
	while(*p != '\0') 
	{
	/* 路徑列表使用":"來分隔路徑*/
		if(*p != ':')  
			buffer[i++] = *p;
		else 
		{
		buffer[i++] = '/';
		buffer[i] = '\0';
		/* 將指令和路徑合成,形成pathname,并使用access函數來判斷該文件是否存在*/
		strcat(buffer,order);
		if(access(buffer,F_OK) == 0)     /* 文件被找到*/
			return buffer;
		else                          /* 繼續尋找其他路徑*/
			i=0;
		}
		p++;
	}
	/* 搜索完所有路徑,依然沒有找到則返回 NULL*/
	return NULL;
}

int number(const char *input)	//分析命令和參數數量,來劃分相應字符串
{
	int i=0,k=0;
	int input_len=strlen(input);
	k=0;	//k記錄命令和參數數量
	int flag=0;
	for (i=0;i<input_len;i++)
	{

		if(input[i]==' '||input[i]=='<'||input[i]=='>'||input[i]=='	')
		{
			flag=0;
			continue;
		}
		else 
		{
			if(flag==0)
			{
				flag=1;
				k++;
			}
		}
	}
	return k;
}
char **analize(const char *input)	//分析鍵入的命令,獲取命令和參數并保存在arg中
{
	int number(const char *input);	//分析命令和參數數量,來劃分相應字符串
	
	int i,j,k;	//k記錄命令和參數數量
	int input_len;
	int is_back=0;

	char *buffer;
	char **arg;//存放命令及相應參數

	input_len=strlen(input);

	if((buffer=(char *)malloc((input_len+1)*(sizeof(char))))==0)
	{
		fprintf(stderr,"error! can't malloc enough space for buffer\n");
		return NULL;
	}
	
	//分析命令和參數數量
	k=number(input);
	if((arg=(char **)malloc((k+1)*sizeof(char *)))==0)
	{
		fprintf(stderr,"error! can't malloc enough space for arg\n");
		return NULL;
	}
	
	//將輸入命令劃分為相應命令和參數
	for (i=0,j=0,k=0;i<=input_len;i++)
	{
		if(input[i]==' '||input[i]=='<'||input[i]=='>'||input[i]=='	'||input[i]=='\0')
		{
			if(j == 0) /*這個條件可以略去連在一起的多個空格或者TAB */
				continue;
			else 
			{
				buffer[j] = '\0';
				j++;
				arg[k] = (char *)malloc(sizeof(char)*j);
				/* 將指令或參數從緩存拷貝到arg中*/
				strcpy(arg[k], buffer);
				j=0;  /* 準備去下一個參數*/
				k++;
			}
		}
		else 
		{   /* 如果字符串最后是 '&',則置后臺運行標記為 1 */
			if(input[i]== '&' && input[i+1]=='\0') 
			{
				is_back = 1;
				continue;
			}
			buffer[j]=input[i];
			j++;
		}
	}
	/* 在使用exec執行命令的時候,最后的參數必須是NULL指針,所以將最后一個參數置成空值*/
	arg[k]=NULL;

	//釋放申請空間
	free(buffer);
	return arg;
}
char *read_order(char *buffer)		//從鍵盤中讀取命令
{
	char lc_char;
	char *input;
	int input_lenth=0;

	lc_char = getchar();
	while(lc_char != '\n' && input_lenth < BUFFERSIZE) 
		{
			buffer[input_lenth] = lc_char;
			lc_char = getchar();
			input_lenth++;
		}
	if(input_lenth >= BUFFERSIZE) //超過允許緩沖區最大長度則抱錯退出
	{
		fprintf(stderr,"Your command too long ! Please reenter your command !\n");
		input_lenth = 0;     /* Reset */
		return NULL;
	}
	else  
	buffer[input_lenth] = '\0'; //加上串結束符,形成字符串
	if((input=(char *)malloc(sizeof(char)*(input_lenth+1)))==0)
	{
		fprintf(stderr,"error! can't malloc enough space for input\n");
		return NULL;
	}
	strcpy(input, buffer);
	return input;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲精品成人久久奇米网| 免费在线观看一区二区三区| 国产成人日日夜夜| 亚洲欧美福利一区二区| 91精品久久久久久久99蜜桃| 国产一区二区三区四区五区入口 | 久草这里只有精品视频| 亚洲欧洲日韩一区二区三区| 欧美日韩一级片在线观看| 国产精品一区免费在线观看| 亚洲成年人网站在线观看| 精品欧美黑人一区二区三区| 色视频欧美一区二区三区| 韩国一区二区三区| 日韩高清中文字幕一区| 国产精品久久久久影院色老大| 欧美一区二区三区白人| 91视频在线观看免费| 国产91精品免费| 懂色av一区二区三区免费观看 | 综合电影一区二区三区 | 26uuu欧美| 国产日韩精品一区二区浪潮av| 777午夜精品免费视频| 91精品福利在线| 97久久精品人人澡人人爽| 色婷婷国产精品久久包臀| www.在线成人| 欧美性xxxxx极品少妇| 欧美午夜精品一区二区三区 | 欧美做爰猛烈大尺度电影无法无天| 成人精品免费网站| 97久久精品人人做人人爽50路| 成人精品小蝌蚪| 一本到三区不卡视频| 色哟哟国产精品| 欧美吻胸吃奶大尺度电影| 欧美一区二区三区婷婷月色| 337p日本欧洲亚洲大胆色噜噜| 国产欧美日韩在线视频| 亚洲综合一区二区精品导航| 视频一区二区不卡| 成人一区在线看| 欧美日韩免费高清一区色橹橹| 欧美精品第1页| 国产亚洲一区二区三区| 欧美成人艳星乳罩| 在线成人免费视频| 99久久国产综合精品色伊| 亚洲线精品一区二区三区| 日韩精品一级中文字幕精品视频免费观看 | 国产在线视频精品一区| 东方欧美亚洲色图在线| 色爱区综合激月婷婷| 欧美日韩国产影片| 久久精品男人的天堂| 亚洲久草在线视频| 久久草av在线| 欧美日本免费一区二区三区| 欧美精品一区二区久久婷婷| 亚洲欧美日韩电影| 九九国产精品视频| 91日韩一区二区三区| 国产日韩三级在线| 久久草av在线| 欧美巨大另类极品videosbest| 久久久久99精品国产片| 亚洲va韩国va欧美va精品| 日韩一区二区在线观看| 亚洲精品乱码久久久久久久久 | 精品视频在线免费| 亚洲成人你懂的| 欧美一级二级在线观看| 久久综合综合久久综合| 久久精品综合网| 91官网在线观看| 日本aⅴ免费视频一区二区三区| 欧美日韩三级视频| 久久机这里只有精品| 中文字幕在线不卡| 欧美在线一区二区三区| 天堂影院一区二区| 久久久久久久综合狠狠综合| 奇米色777欧美一区二区| 国产精品美女久久久久av爽李琼 | 欧美午夜寂寞影院| 国产麻豆精品视频| 日韩电影在线观看电影| 一区二区三区在线观看欧美| 亚洲天堂免费看| 国产精品自拍在线| 日韩三级中文字幕| 91福利视频网站| 欧美日韩国产123区| 国产精品午夜在线| 一本久久精品一区二区 | 韩国女主播一区| 亚洲一区二区在线免费看| 亚洲欧洲精品一区二区三区| 国产精品灌醉下药二区| 亚洲欧美一区二区三区孕妇| 亚洲欧美韩国综合色| 亚洲一区二区三区三| 五月天视频一区| 久久99热这里只有精品| 国产成人av资源| 色综合色狠狠综合色| 国产成人精品1024| 中文字幕在线一区二区三区| 99久久婷婷国产精品综合| 中文字幕日韩av资源站| 精品国产一区二区亚洲人成毛片| 国产综合色在线视频区| 国产精品欧美一区二区三区| 日韩一区二区视频| 国产在线日韩欧美| 久久99九九99精品| 国产成人午夜视频| 国产一区二区三区四区五区入口| wwww国产精品欧美| 亚洲国产高清aⅴ视频| 日韩综合小视频| 色欧美88888久久久久久影院| 亚洲三级在线免费| 日韩精品每日更新| 欧美丰满美乳xxx高潮www| 色婷婷综合久久久久中文一区二区| 不卡的av在线| 不卡的电影网站| 99精品视频一区二区三区| 菠萝蜜视频在线观看一区| 成人美女视频在线观看18| 国产suv精品一区二区883| 高清国产一区二区| 成人网在线免费视频| av亚洲精华国产精华| 91亚洲精品久久久蜜桃网站| 欧美日韩精品一区二区三区蜜桃| 在线视频你懂得一区| av一区二区三区四区| 国产露脸91国语对白| 极品瑜伽女神91| 成人免费精品视频| 韩国av一区二区三区在线观看| 一区二区三区在线高清| 国产精品视频第一区| 亚洲精品精品亚洲| 亚洲精品一区二区精华| 久久se这里有精品| 成人丝袜高跟foot| 欧美亚洲图片小说| 精品视频在线看| 久久久.com| 国产成人高清视频| 亚洲精品福利视频网站| 欧美色精品在线视频| 国内不卡的二区三区中文字幕| 久久人人超碰精品| 欧美日韩一级片在线观看| 激情偷乱视频一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 一本久久a久久免费精品不卡| 麻豆国产91在线播放| 一区二区在线观看免费| 久久久高清一区二区三区| 亚洲成av人片一区二区梦乃| 国产精品伦理一区二区| 97aⅴ精品视频一二三区| 一区二区三区四区蜜桃 | 日韩精品一区二区三区三区免费| 天涯成人国产亚洲精品一区av| 欧美性淫爽ww久久久久无| 奇米一区二区三区| 久久精品视频免费观看| 日韩一级免费一区| 色婷婷综合久久久久中文一区二区| 亚洲乱码精品一二三四区日韩在线| 91视视频在线直接观看在线看网页在线看| 欧美久久久一区| 亚洲国产中文字幕| 欧美三日本三级三级在线播放| 欧美变态口味重另类| 国产精品1区二区.| 一色桃子久久精品亚洲| 成人免费不卡视频| 日本欧美大码aⅴ在线播放| 亚洲激情第一区| 国产午夜一区二区三区| 欧美久久免费观看| 91丝袜美腿高跟国产极品老师| 午夜视频一区二区三区| 最好看的中文字幕久久| 久久九九全国免费| 精品少妇一区二区三区视频免付费| 色综合天天综合色综合av| 国产精品综合网| 国产一区不卡在线| 国产一区二区精品久久99| 午夜精品免费在线| 亚欧色一区w666天堂|