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

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

?? shell.cpp

?? Linux shell實現,包括管道
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*****************************************************************************/
/*作者:王偉*/
/*班級:自42*/
/*學號:2004011443*/
/*程序功能:模擬linux下shell環境,實現shell功能*/
/*日期:2007.6.1*/
/*****************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define BUFFERSIZE 80
int main(void) 
{
	char *read_order(char *buffer);		//從鍵盤中讀取命令
	char **order_name(const char *input);	//返回每條命令
	int pipel(char * input);
	int pipe_number(const char *input);//統計管道數量
	int redirect(char *input);//輸入輸出重定向
	int order_number(const char *input);	//統計命令數量,以;相隔

	char *path,*buffer;
	char *all_order,**every_order;
	int i,pipe,k,number;

	if((buffer=(char *)malloc(BUFFERSIZE*(sizeof(char))))==0)
	{
		printf("error! can't malloc enough space for buffer\n");
		return (0);
	}

	while(1)
	{
		path=getcwd(NULL,0);	//取得當前所在路徑
		printf("%s > $", path);
		all_order=read_order(buffer);		//讀取命令
		if(all_order==NULL)
			continue;
		number=order_number(all_order);
		if (number<0)
			continue;
		every_order=order_name(all_order);
		i=0;
		while (i<number)
		{
			if(strlen(every_order[i])!=0)
			{
				k=pipe_number(every_order[i]);	//是否有管道
				if(k!=0)
					pipel(every_order[i]);
				else
					redirect(every_order[i]);	//輸入輸出重定向或普通命令
				//for debug
				//printf("%s\n",every_order[i]);
			}
			i++;
		}
		//釋放申請的空間
		for(i=0;i<number;i++)
			free(every_order[i]);
		free(every_order);
		free(all_order);
		free(path);
	}
}
char **order_name(const char *input)	//返回每條命令
{
	int order_number(const char *input);	//統計命令數量,以;相隔

	int i,j,k,max_len;
	char **order;
	
	max_len=strlen(input);
	k=order_number(input);
	order=(char **)malloc(k*sizeof(char *));
	for(i=0;i<k;i++)
	{
		order[i]=(char *)malloc((max_len+1)*sizeof(char));
		order[i][0]='\0';
	}
	//分別取出被";"分割開的命令
	k=0;
	j=0;
	for (i=0;i<=max_len;i++)
	{
		if (input[i]!=';')
		{
			order[k][j]=input[i];
			j++;
		}
		else
		{
			order[k][j]='\0';
			k++;
			j=0;
		}
	}
	//show the orders that are departed by ';'
	/*for(i=0;i<k+1;i++)
		printf("%s\n",order[i]);*/
	return order;
}
int order_number(const char *input)	//統計命令數量,以;相隔
{
	int sum=0,i=0,len;
	len=strlen(input);
	while(i<len&&(input[i]==' '||input[i]=='	'))
		i++;
	if(input[i]==';')	//發生錯誤,出現;;
	{
		fprintf(stderr," syntax error near unexpected token: ;\n");
		return -1;
	}
	if (i==len)		//命令參數中只有空格或tab
		return -1;
	for (i=0;i<len;i++)
	if(input[i]==';')
	{
		while(i<strlen(input)&&(input[i+1]==' '||input[i+1]=='	'))
			i++;
		if(input[i+1]==';')	//發生錯誤,出現;;
		{
			fprintf(stderr," syntax error near unexpected token: ;;\n");
			return -1;
		}
		else
			sum++;
	}
	sum=sum+1;
	return sum;
}
int pipel(char * input)
{
	int redirect(char *input);
	int is_back(char *order);	//分析是否為后臺進程,并且將字符&去掉
	int pipe_number(const char *input);	//統計管道數量	
		
	int status,i,j,k,**fd,back=0,len;
	char **order;
	int *child;
	
	back=is_back(input);
	len=strlen(input);
	k=pipe_number(input);
	order=(char **)malloc((k+1)*sizeof(char *));
	for(i=0;i<k+1;i++)
		order[i]=(char *)malloc((len+1)*sizeof(char));

	child=(int *)malloc((k+1)*sizeof(char *));
	fd=(int **)malloc(k*sizeof(int *));
	for(i=0;i<k;i++)
		fd[i]=(int *)malloc(2*sizeof(int));
	
	//分別取出被管道分割開的命令
	k=0;
	j=0;
	for (i=0;i<=len;i++)
	{
		if (input[i]!='|')
		{
			order[k][j]=input[i];
			j++;
		}
		else
		{
			order[k][j]='\0';
			k++;
			j=0;
		}
	}
	//test
	/*for(i=0;i<k+1;i++)
		printf("%s\n",order[i]);*/
	/*分析完畢*/

	//create the pipe
	for(i=0;i<k;i++)
		if(pipe(fd[i]) == -1) 
		{
			fprintf(stderr, "Open pipe error !\n");
			//printf("Open pipe error !\n");
			return 0;
		}
	//create the first child
	i=0;
	if((child[i]=fork())==0)
	{
		close(fd[i][0]);
		if(fd[i][1] != STDOUT_FILENO) 
		{
			// 將標準的輸出重定向到管道的寫入端,這樣該子進程的輸出就寫入了管道
			if(dup2(fd[i][1], STDOUT_FILENO) == -1) 
			{
				fprintf(stderr, "Redirect Standard Out error !\n");
				//printf("Redirect Standard Out error !\n");
				return -1;
			}
			//關閉寫入端
			close(fd[i][1]);
		}
		redirect(order[i]);	
		exit(1);	//child1 exit
	}
	else
	{
		//wait for child
		waitpid(child[i],&status,0);
		close(fd[i][1]);
	}
	i++;
	while(i<k)
	{
		if ((child[i]=fork())==0)
		{
			if(fd[i][0] != STDIN_FILENO) 
			{
				// 將標準的輸入重定向到管道的讀入端
				if(dup2(fd[i-1][0], STDIN_FILENO) == -1) 				
				{
					fprintf(stderr, "Redirect Standard In error !\n");
					//printf("Redirect Standard In Error !\n");
					return -1;
				}
				close(fd[i-1][0]);
				// 將標準的輸出重定向到管道的寫入端,這樣該子進程的輸出就寫入了管道
				if(dup2(fd[i][1], STDOUT_FILENO) == -1) 				
				{
					fprintf(stderr, "Redirect Standard Out error !\n");
					//printf("Redirect Standard Out error !\n");
					return -1;
				}
				close(fd[i][1]);
			}
			redirect(order[i]);
			exit(1);
		}
		else
		{
			//wait for child
			waitpid(child[i],&status,0);
			close(fd[i][1]);
			i++;
		}
	}
	//create the last child
	if((child[i] = fork()) == 0) 
	{
		close(fd[i-1][1]);
		if(fd[i-1][0] != STDIN_FILENO) 
		{
			// 將標準的輸入重定向到管道的讀入端
			if(dup2(fd[i-1][0], STDIN_FILENO) == -1) 
			{
				fprintf(stderr, "Redirect Standard In error !\n");
				//printf("Redirect Standard In Error !\n");
				return -1;
			}
			close(fd[i-1][0]);
		}
		redirect(order[i]);
		exit(1);
	}
	else if(back==0)  
	{
		waitpid(child[i], NULL, 0);
		close(fd[i-1][1]);
	}
	//釋放申請的空間
	for(i=0;i<k;i++)
		free(fd[i]);
	free(fd);
	for(i=0;i<k+1;i++)
		free(order[i]);
	free(order);
	free(child);
	return 1;
	/**************************************************/
}

int pipe_number(const char *input)//統計管道數量
{
	int sum=0,i;
	for (i=0;i<strlen(input);i++)
	if(input[i]=='|')
		sum++;
	return sum;
}
void do_cd(char *argv[])	//專門用于cd命令
{ 
	if(argv[1]!=NULL)
	{ 
		if(chdir(argv[1])<0) 
			switch(errno)
		{ 
			case ENOENT: 
				fprintf(stderr,"DIRECTORY NOT FOUND\n"); 
				break; 
			case ENOTDIR: 
				fprintf(stderr,"NOT A DIRECTORY NAME\n"); 
				break; 
			case EACCES: 
				fprintf(stderr,"YOU DO NOT HAVE RIGHT TO ACCESS\n"); 
				break; 
			default: 
				fprintf(stderr,"SOME ERROR HAPPENED IN CHDIR\n"); 
		} 
	}
} 
int redirect(char *input)	//重定向處理
{
	char **analize(const char *input);	//分析鍵入的命令,獲取命令和參數并保存在arg中
	char *is_file_exist(const char *order);		//判斷命令是否存在
	void do_cd(char *argv[]);	//專門用于cd命令

	int number(const char *input);	//分析命令和參數數量,來劃分相應字符串
	int is_back(char *order);	//分析是否為后臺進程,并且將字符&去掉
	int pipe_number(const char *input);	//統計管道數量

	char *order_path,*real_order;
	char *out_filename,*in_filename;
	char **analized_order;
	int len,status,i,j,k,back=0,fd_out,fd_in,flag_out=0,flag_in=0;
	pid_t pid;
	
	back=is_back(input);
	len=strlen(input);
	out_filename=(char *)malloc((len+1)*(sizeof(char)));
	in_filename=(char *)malloc((len+1)*(sizeof(char)));
	real_order=(char *)malloc((len+1)*(sizeof(char)));

	//讀取字符串中的命令,并存放于real_order中
	for(i=0;i<len;i++)
	{
		if (input[i]!='>'&&input[i]!='<')
			real_order[i]=input[i];
		else
		{
			if (input[i]=='>')
				flag_out=1;
			if (input[i]=='<')
				flag_in=1;
			break;
		}
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久精品一区二区二区| 色综合天天综合网国产成人综合天| 久久九九久久九九| 99久久综合99久久综合网站| 五月天久久比比资源色| 99re这里都是精品| 亚洲精品国久久99热| 欧美欧美午夜aⅴ在线观看| 天天操天天干天天综合网| 国产成人免费网站| 亚洲一区二区免费视频| 欧美一区二区三区成人| 成人免费三级在线| 精品一区二区三区在线观看| 亚洲成人自拍一区| 国产精品的网站| 久久精品人人做人人综合 | 色呦呦日韩精品| 免费成人av在线| 天堂在线亚洲视频| 久久日韩粉嫩一区二区三区| 麻豆精品国产传媒mv男同| 亚洲精品视频一区| 国产精品久久毛片a| 国产三区在线成人av| 精品国产一区二区亚洲人成毛片| 欧美在线免费视屏| 91久久精品网| av亚洲精华国产精华精华| 成人91在线观看| 国产大陆a不卡| 国产精品一区二区果冻传媒| 国模一区二区三区白浆| 日韩av网站在线观看| 亚洲chinese男男1069| 亚洲精品午夜久久久| 亚洲男女一区二区三区| 视频一区国产视频| 国产日韩欧美一区二区三区综合| 欧美在线一二三| 国产精品一区二区久久精品爱涩| 国产毛片精品国产一区二区三区| 国产在线观看免费一区| 狠狠色综合播放一区二区| 国产大陆亚洲精品国产| 成年人午夜久久久| 99久久久精品免费观看国产蜜| 色婷婷综合五月| 欧美日韩小视频| 欧美成人女星排名| 精品国产污网站| 中文字幕电影一区| 成人欧美一区二区三区视频网页| 一区二区三区美女| 日本女人一区二区三区| 久久精品国产一区二区| 国产成人综合自拍| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美日韩在线播放三区四区| 欧美三级一区二区| 在线观看av一区二区| 99国产一区二区三精品乱码| 在线精品观看国产| 国产成人午夜精品影院观看视频| 狠狠色丁香久久婷婷综合_中| 亚洲高清视频的网址| 亚洲美女免费视频| 综合激情网...| 久久精品一区蜜桃臀影院| 久久久久久久久久久久久女国产乱 | 884aa四虎影成人精品一区| 精品久久久久香蕉网| 综合色中文字幕| 麻豆视频观看网址久久| 91亚洲永久精品| 精品国产91久久久久久久妲己| 综合在线观看色| 国产中文字幕一区| 色999日韩国产欧美一区二区| 久久婷婷色综合| 视频一区视频二区中文| 97精品国产露脸对白| 日韩精品一区二区三区在线观看 | 欧美激情综合五月色丁香 | 国产精品中文欧美| 欧美挠脚心视频网站| 亚洲一区在线看| jiyouzz国产精品久久| 精品国产欧美一区二区| 亚洲自拍偷拍九九九| caoporen国产精品视频| 精品三级av在线| 亚洲国产乱码最新视频| 成人av影院在线| 国产日产欧产精品推荐色 | 日韩一区精品视频| 99这里只有久久精品视频| 欧美一级高清片在线观看| 欧美高清性hdvideosex| 欧美国产激情一区二区三区蜜月| 香蕉久久夜色精品国产使用方法| 91蜜桃网址入口| 欧美激情综合网| 国产成人精品影视| 欧美va天堂va视频va在线| 久久久欧美精品sm网站| 捆绑调教美女网站视频一区| 欧美少妇一区二区| 亚洲一区二区黄色| 在线区一区二视频| 亚洲国产精品尤物yw在线观看| 93久久精品日日躁夜夜躁欧美| 91小宝寻花一区二区三区| 色网站国产精品| 国产区在线观看成人精品| 秋霞影院一区二区| 欧美一区二区在线观看| 日韩av二区在线播放| 日韩欧美不卡一区| 国产一区二区伦理片| 国产喂奶挤奶一区二区三区| 国产成人免费9x9x人网站视频| 久久综合久久久久88| 韩国三级中文字幕hd久久精品| 欧美在线观看视频在线| 亚洲成人一区二区| 7777精品伊人久久久大香线蕉| 图片区小说区区亚洲影院| 宅男在线国产精品| 亚洲高清免费视频| 在线免费一区三区| 亚洲黄色在线视频| 日本高清成人免费播放| 日韩av不卡在线观看| 久久网站热最新地址| 不卡的电视剧免费网站有什么| 亚洲午夜私人影院| 日韩欧美国产精品一区| 国产精品正在播放| 一区二区不卡在线视频 午夜欧美不卡在 | 一区免费观看视频| 欧美日韩中文字幕一区二区| 日韩精品电影在线| 欧美一三区三区四区免费在线看 | 亚洲成av人片观看| 久久精品亚洲乱码伦伦中文| 91视频www| 韩国v欧美v日本v亚洲v| 国产精品国产精品国产专区不蜜| 成人国产精品免费观看视频| 久久久久国产成人精品亚洲午夜| 色综合天天综合给合国产| 日本不卡视频在线观看| 国产精品你懂的| 日韩免费观看2025年上映的电影| 99视频在线精品| 黄一区二区三区| 欧美一级欧美三级在线观看| 麻豆91精品91久久久的内涵| 国产精品美女久久久久高潮| 5858s免费视频成人| 成人app下载| 国产一区二区伦理| 免费一级欧美片在线观看| 亚洲欧美区自拍先锋| 久久久久国产一区二区三区四区| 欧美日韩免费视频| 99re亚洲国产精品| 国产尤物一区二区| 免播放器亚洲一区| 亚洲色欲色欲www| 一区二区三区四区av| 成人性色生活片免费看爆迷你毛片| 国产日本欧美一区二区| 中文字幕在线一区| 一级日本不卡的影视| 免费成人在线观看视频| 国产在线一区观看| 91欧美一区二区| 91精品国产综合久久精品| 国产亚洲人成网站| 亚洲猫色日本管| 麻豆成人在线观看| 91视视频在线观看入口直接观看www | 国产亚洲欧美日韩日本| 亚洲尤物在线视频观看| 经典三级一区二区| 99久久久国产精品免费蜜臀| 日韩一区二区三区电影| 国产视频911| 亚洲大片在线观看| 国产高清无密码一区二区三区| 在线欧美日韩国产| 欧美精彩视频一区二区三区| 亚洲图片自拍偷拍| 国产xxx精品视频大全| 91精品国产综合久久香蕉的特点| 国产精品久久久爽爽爽麻豆色哟哟 | 国产在线国偷精品免费看| 色婷婷综合久久久|