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

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

?? ysh.c

?? · Develop clear, readable, well-documented and well-designed programs in the C Programming Language.
?? C
?? 第 1 頁 / 共 2 頁
字號:
	for (i=0,j=0,k=0;i<=len;i++) {
		if (input[i]==' '||input[i]=='\t'||input[i]=='\0'||input[i]=='|'||input[i]=='>'||input[i]=='\n') {
			if (input[i]=='|'||input[i]=='>') {
				if (input[i]=='>') flag=1;
				if (j>0) {
					buf[j++]='\0';
					argv[li_cmd][k]=(char *) malloc(sizeof(char)*j);
					strcpy(argv[li_cmd][k],buf);
					k++;
				}
				argv[li_cmd][k]=(char *) 0;
				li_cmd++;
				k=0;
				j=0;
			}
			if (j==0)
				continue;
			else{
				buf[j++]='\0';
				if (flag==0) {/*flag==0命令中不含“>”、“<”重定向命令*/
					argv[li_cmd][k]=(char *) malloc(sizeof(char)*j);
					strcpy(argv[li_cmd][k],buf);
					k++;
				}else {/*flag==1命令中包含“>”、“<”重定向命令,重定向命令后為文件名*/
					filename[0]=(char *) malloc (sizeof(char)*j);
					strcpy(filename[0],buf);
				}
			}
			j=0;
		}else{
			if (input[i]=='&'&&input[i++]=='\0'){/*帶后臺符號的命令*/
				is_bg=1;
				continue;
			}
			buf[j++]=input[i];
		}
	}

	argv[li_cmd][k++]=(char *) 0;/*最后一參數置空*/

	for (i=0;i<=10;i++) {/*初始化文件描述符*/
		fd[i][FD_READ]=NO_PIPE;
		fd[i][FD_WRITE]=NO_PIPE;
	}

	for (i=0;i<li_cmd;i++) {/*為命令建立相應的管道*/
		if (pipe(fd[i])==-1) {
			printf("Can not open pipe!\n");
			return 0;
		}
	}

	/*************************尋找命令文件,執行命令*************************/
	for (i=0;i<=li_cmd;i++) {
		if (is_founded(argv[i][0])==0) {
			printf("Can not found command!\n");
			break;
		}

		/*********將pipe_in指向到管道的讀端(第一條命令除外)***********/
		if (i!=0)
			pipe_in=fd[i-1][FD_READ];
		else pipe_in=NO_PIPE;/*第一條命令除外*/

		/*********將pipe_out指向到管道的寫端(最后一條命令除外)*********/
		if (i!=li_cmd)
			pipe_out=fd[i][FD_WRITE];
		else 
			if (flag==1) {/*包含重定向命令*/
				/*將pipe_out指向到文件*/
				if ((pipe_out=open(filename[0],
					O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1){
				printf ("Can not open %s \n",filename[0]);
				break;
				}
			}else pipe_out=NO_PIPE;/*最后一條命令除外*/

		if ((pid=fork())<0){
			printf("Fork failed!\n");
			return 0;
		}

		if (pid==0) {
			if (pipe_in==NO_PIPE)
				close(pipe_in);
			if (pipe_out==NO_PIPE)
				close(pipe_out);

			if (pipe_out!=NO_PIPE) {
				/*將標準輸出重定向到管道的寫端,
				這樣該子進程的輸出就寫入管道了*/
				dup2(pipe_out,1);
				close(pipe_out);
			}

			if (pipe_in!=NO_PIPE) {
				/*將標準輸入重定向到管道的讀端,
				這樣管道的數據就可以被讀到了*/
				dup2(pipe_in,0);
				close(pipe_in);
			}
			execv(buf,argv[i]);
		}else {
			if (is_bg==0)
				waitpid(pid,NULL,0);
				close(pipe_in);
				close(pipe_out);
		}
	}
	return 0;

}


/****************************     初始化函數     *****************************/
int getline(int fd,char *buf)/*按行讀取*/
{
	int i=0;
	char c;
	while (read(fd,&c,1)){
		buf[i++]=c;
		if (c=='\n'){
			buf[i-1]='\0';
			return i;
		}
	}
	return i;
}

void getenviron(int n,char *s)
{
	int i=0,j=0,k=0;
	char c,buff[80],*p;
	while ((c=s[i])!='='){
		buff[i++]=c;
	}
	buff[i++]='\0';
	if (strcmp(buff,"PATH")==0){
		while (s[i]!='\0'){
			if (s[i]==':'){/*將以“:”分隔的查找路徑分別設置到envpath[]中*/
				buff[j++]='/';
				buff[j]='\0';
				p=(char *) malloc(strlen(buff)+1);
				strcpy(p,buff);
				envpath[k++]=p;/*將路徑保存在envpath[k]中*/
				envpath[k]=NULL;/*字符串尾置空*/
				j=0;/*為下一個envpath[i]作準備*/
				i++;
			}else {
				buff[j]=s[i];
				j++;
				i++;
			}
		}
	}else fprintf(stderr,"No match");
}

void init_environ()
{
	int fd,n,i;
	char buf[80];
	/*打開保存查找路徑的ysh_profile文件*/
	if ((fd=open("ysh_profile",O_RDONLY,660))==-1)
	{
		printf("init environ variable error\n");
		exit(1);
	}
	while (n=getline (fd,buf)){
		getenviron(n,buf);/*getenviron()函數*/
	}
	envhis.start=0;/*初始化history循環數組*/
	envhis.end=0;	head=end=NULL;/*初始化jobs鏈表指針*/
}

/****************************  查找命令文件函數  *****************************/
int is_founded(char *cmd) 
{
	int k=0;
	while (envpath[k]!=NULL){/*查找路徑已在程序初始化時設定在envpath[i]中*/
		strcpy(buf,envpath[k]);
		strcat(buf,cmd);
		if (access(buf,F_OK)==0)  /*文件被找到*/
			return 1;
		k++;
	}
	return 0;
}

/****************************     history命令    *****************************/
void add_history(char *inputcmd)
{
	envhis.end=(envhis.end+1)%HISNUM;/*end前移一位*/
	if (envhis.end==envhis.start){/*end和start指向同一數組*/
		envhis.start=(envhis.start+1)%HISNUM;/*start前移一位*/
	}
	strcpy(envhis.his_cmd[envhis.end],inputcmd);/*將命令復制到end指向的數組中*/	
}

void history_cmd()
{
	int i,j=0;
	if (envhis.start==envhis.end)/*循環數組為空*/
		return;
	else if (envhis.start<envhis.end) {/*start<end時*/
		for (i=envhis.start+1;i<=envhis.end;i++) {/*顯示start+1到end數組中的命令*/
			printf("%d\t%s\n",j,envhis.his_cmd[i]);
			j++;
		}
	}else {/*start>end時*/
		for (i=envhis.start+1;i<HISNUM;i++) {/*顯示start+1到HISNUN數組中的命令*/
			printf("%d\t%s\n",j,envhis.his_cmd[i]);
			j++;
		}
		for (i=0;i<=envhis.end;i++) {/*顯示0到end數組中的命令*/
			printf("%d\t%s\n",j,envhis.his_cmd[i]);
			j++;
		}
	}
}

/****************************        cd命令      *****************************/
void cd_cmd(char *route)
{
	if (route!=NULL) {/*路徑不為空*/
		if (chdir(route)<0) {/*chdir()系統調用,達到改變當前路徑的目的*/
			printf("cd;%s Error file or directory!\n",route);
		}
	}
}

/****************************      jobs命令     *****************************/void jobs_cmd(){	NODE *p;	int i=1;	p=head;
	/*遍歷鏈表,顯示相關內容*/	if (head!=NULL) {	/*鏈表不為空*/		do {			printf("%d  %d  %s\t%s\n",i,p->pid,p->state,p->cmd);			i++;			p=p->link;		}while (p!=NULL);	} else printf("No jobs!\n");/*鏈表為空*/}
void add_node(char *input_cmd,int node_pid){	NODE *p;	p=(NODE *) malloc(sizeof(NODE));/*申請新節點*/	p->pid=node_pid;                /*設置節點信息*/	strcpy(p->cmd,input_cmd);       /*保存命令信息*/	strcpy(p->state,"running");     /*設置工作狀態*/	p->link=NULL;	if (head==NULL) {/*若鏈表為空*/		head=p;		end=p;	}else {/*鏈表不為空*/		end->link=p;/*將鏈表尾節點指針指向新節點*/		end=p;/*將end指向鏈表尾*/	}}

void del_node(int sig,siginfo_t *sip)/*刪除節點*/{	NODE *q,*p;	int id;
	/*當按下ctrl-z時,也會收到SIGCHLD信號,這種情況不刪除節點*/	if (sig_z==1) {sig_z=0;goto out;}	
	id=sip->si_pid;/*獲得發送SIGCHLD信號的進程的進程號*/	p=q=head;	if (head==NULL) goto out;/*鏈表為空*/
	/*遍歷鏈表找到相應節點*/	while (p->pid!=id&&p->link!=NULL)/*找到要刪除的節點p*/		p=p->link;	if (p->pid!=id) {goto out;}	if (p==head) {/*p為頭節點*/		head=head->link;	}else {		while(q->link!=p)/*找到p的前驅節點q*/			q=q->link;		if (p==end) {/*p為尾節點*/			end=q;			q->link=NULL;		}else q->link=p->link; 	} 	free(p);out:     return;}
void setflag(){	sig_flag=1;}/****************************   前后臺切換命令   *****************************/void ctrl_z(){	NODE *p;	int i=1;	if (pid1==0) goto out;/*前臺沒有工作*/
	/*改變鏈表中的相應節點的狀態*/	if (head!=NULL) {/*鏈表不為空*/		p=head;
		/*遍歷鏈表,看該工作是否已經在鏈表中*/		while (p->pid!=pid1&&p->link!=NULL)			p=p->link;		if (p->pid==pid1) /*工作已在鏈表中*/			{strcpy(p->state,"stopped");}		else {/*工作不在鏈表中*/			add_node(input,pid1);/*增加新節點*/			strcpy(end->state,"stopped");/*設置節點狀態*/		}	}else {/*連標為空*/		add_node(input,pid1);/*增加新節點*/		strcpy(end->state,"stopped");/*設置節點狀態*/	}	sig_z=1;/*sig_z標志置一,del_node()函數中不用刪除節點*/	kill(pid1,SIGSTOP);/*發送SIGSTOP信號給正在前臺運行的工作,將其停止*/	for (p=head;p->pid!=pid1;p=p->link)/*顯示提示信息*/		i++;	printf("[%d]\t%s\t%s\n",i,end->state,end->cmd);	pid1=0;out:     return;}void bg_cmd(int job_num){	NODE *p;	int i=0;	p=head;
	/*根據作業號,遍歷鏈表,找到指定節點*/	for (i=1;i<job_num;i++)		p=p->link;	kill(p->pid,SIGCONT);/*向對應工作發送SIGCONT信號,使其在后臺運行*/	strcpy(p->state,"running");/*修改對應節點狀態*/}void fg_cmd(int job_num){	NODE *p;	int i=0;	p=head;
	/*根據作業號,遍歷鏈表,找到指定節點*/	for (i=1;i<job_num;i++)		p=p->link;	strcpy(p->state,"running");/*修改對應節點狀態*/	strcpy(input,p->cmd);/*將命令名復制到input中,為下一次按下ctrl-z作準備*/	pid1=p->pid;/*獲取該節點對應工作的進程號*/	signal(SIGTSTP,ctrl_z);/*設置signal()信號,為下一次按下ctrl-z作準備*/	kill(p->pid,SIGCONT);/*向對應工作發送SIGCONT信號,使其運行*/	waitpid(p->pid,NULL,0);/*父進程等待前臺進程的運行*/}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人精品免费网站| 亚洲精品水蜜桃| 精品粉嫩超白一线天av| 久久老女人爱爱| 一区二区三区不卡视频在线观看| 久久精品国产网站| 94-欧美-setu| 精品88久久久久88久久久| 国产精品一级二级三级| 欧美日本一区二区三区四区| 久久久久88色偷偷免费| voyeur盗摄精品| 久久九九影视网| 久久精品99久久久| 日本一区二区综合亚洲| 久久99精品国产.久久久久久| 欧美视频中文一区二区三区在线观看| 26uuu欧美| 韩国av一区二区| 欧美sm极限捆绑bd| 美女尤物国产一区| 5858s免费视频成人| 亚洲在线成人精品| 97久久超碰国产精品电影| 亚洲成人手机在线| 欧美男男青年gay1069videost| 麻豆免费精品视频| 中文字幕一区二区三区色视频| 国产夫妻精品视频| 国产精品午夜在线观看| 国产激情一区二区三区四区| 亚洲桃色在线一区| 欧美在线视频不卡| 亚洲成人一区二区在线观看| 国产亚洲成av人在线观看导航| 欧美视频三区在线播放| 成人手机在线视频| 久久精品国产99久久6| 《视频一区视频二区| 欧美成人一区二区三区| 欧美亚洲综合久久| av中文字幕一区| 国产一区二区三区电影在线观看| 久久精品水蜜桃av综合天堂| 777xxx欧美| 日本高清免费不卡视频| 一区二区在线观看免费视频播放| 国产亚洲午夜高清国产拍精品| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 天天影视涩香欲综合网| 精品不卡在线视频| 欧美久久久久免费| 国产成人综合在线播放| 麻豆精品视频在线观看视频| 午夜在线成人av| 亚洲成国产人片在线观看| 亚洲欧洲韩国日本视频| 精品国产91九色蝌蚪| 日韩视频一区二区在线观看| 欧美日本一道本在线视频| 精品国产一区二区在线观看| 欧美日本在线播放| 99国产精品一区| 成人精品亚洲人成在线| 极品少妇xxxx偷拍精品少妇| 美女性感视频久久| 秋霞午夜鲁丝一区二区老狼| 日韩欧美久久一区| 成人激情校园春色| 午夜久久久影院| 亚洲va韩国va欧美va精品| 亚洲一区在线观看网站| 亚洲精品视频观看| 亚洲激情五月婷婷| 一区二区三区免费在线观看| 亚洲精选一二三| 亚洲国产精品自拍| 日韩二区在线观看| 国产精品丝袜一区| 国产亚洲一区二区三区四区| 久久久久久久久久看片| 久久精品欧美日韩| 国产精品免费人成网站| 中文字幕在线免费不卡| 亚洲码国产岛国毛片在线| 日韩精品一区二区三区四区 | 美女视频黄久久| 麻豆国产精品一区二区三区| 久久99精品视频| 国产成人午夜精品5599| 成人av在线观| 色综合久久88色综合天天| 国产一区欧美二区| voyeur盗摄精品| 欧美性猛交xxxxxx富婆| 91麻豆精品国产91久久久久久| 日韩免费视频线观看| 国产亚洲精品aa午夜观看| 日韩理论电影院| 亚洲a一区二区| 精品一区二区免费视频| 99re成人精品视频| 91精品国产色综合久久不卡蜜臀 | 91久久国产综合久久| 宅男在线国产精品| 欧美国产成人精品| 精品国产91九色蝌蚪| 中文av一区二区| 亚洲图片欧美视频| 国产精品中文字幕日韩精品 | 成人av影院在线| 在线观看欧美黄色| 蜜桃视频免费观看一区| 成人av网站在线观看免费| 欧美三级乱人伦电影| 久久久久久一级片| 亚洲一区在线观看免费 | 久久精品国产久精国产爱| 粗大黑人巨茎大战欧美成人| 日本精品免费观看高清观看| www国产精品av| 亚洲h动漫在线| www.av亚洲| 久久这里只精品最新地址| 一区二区三区不卡视频| 国产成人午夜精品影院观看视频 | 成人免费高清在线| 欧美一区二区视频网站| 综合激情成人伊人| 国产曰批免费观看久久久| 欧美视频日韩视频| 国产精品成人一区二区艾草| 国产精品久久久久久久久久久免费看| 亚洲成av人片一区二区梦乃| 不卡在线观看av| 精品成人佐山爱一区二区| 午夜免费欧美电影| 色av成人天堂桃色av| 国产日本欧美一区二区| 精品一区二区三区欧美| 欧美久久久久久久久久| 亚洲伊人色欲综合网| av不卡免费电影| 国产亚洲精品bt天堂精选| 成人v精品蜜桃久久一区| 一本久久综合亚洲鲁鲁五月天| 久久夜色精品国产噜噜av| 丝袜美腿亚洲综合| 亚洲成人一二三| 色天天综合久久久久综合片| 国产三级三级三级精品8ⅰ区| 六月丁香婷婷色狠狠久久| 欧美日韩国产一区二区三区地区| 亚洲少妇屁股交4| 不卡一卡二卡三乱码免费网站| 久久久不卡影院| 国产精品123区| 26uuuu精品一区二区| 精品一区二区三区av| 欧美成人一区二区三区在线观看| 免费高清在线视频一区·| 在线成人午夜影院| 日本在线不卡一区| 欧美一区二区三区视频免费| 无码av中文一区二区三区桃花岛| 亚洲资源在线观看| 日本道精品一区二区三区| 午夜精品久久久久久久99水蜜桃| 国产精品18久久久久| 精品久久久久久久久久久久久久久| 日本aⅴ免费视频一区二区三区 | 在线精品亚洲一区二区不卡| 亚洲欧美激情一区二区| 在线一区二区三区四区五区| 亚洲福利视频一区| 欧美一级xxx| 激情综合色播激情啊| 久久久99久久精品欧美| 成人小视频在线| 一区二区三区欧美视频| 欧美精品三级在线观看| 美女精品自拍一二三四| 久久久久久一级片| av欧美精品.com| 亚洲午夜国产一区99re久久| 日韩亚洲电影在线| 国产精品综合一区二区三区| 亚洲视频电影在线| 欧美电影影音先锋| 国产资源在线一区| 成人欧美一区二区三区视频网页| 欧美午夜精品一区二区三区| 久久精品国产澳门| 综合精品久久久| 欧美一区二区三级| 成人免费视频caoporn| 亚洲成av人片在线| 国产欧美日产一区| 欧美日韩精品三区| 国产传媒久久文化传媒|