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

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

?? tsh.c.svn-base

?? os project / shell 程序
?? SVN-BASE
?? 第 1 頁 / 共 2 頁
字號:
        }         if((!strcmp(argv[0],"bg"))||(!strcmp(argv[0],"fg"))) /*bg\fg command */	{            do_bgfg(argv,*output_fd);	    return 1;        }	return 0;     /* not a builtin command */}/*  * do_bgfg - Execute the builtin bg and fg commands */void do_bgfg(char **argv, int output_fd) {         struct job_t *job=NULL;        if(argv[1]==NULL)         /*bg\fg command without pid\jid*/	{	    printf("%s command requires PID or %%jobid argument\n",argv[0]);	    return;	}	        if(argv[1][0]=='%')        /*%jid is a jid*/	{	   int jid;	   jid=atoi(argv[1]+1);	   if((job=getjobjid(jobs, jid))==NULL)  /*is the job found*/	   {	       printf("%s NO such job\n",argv[1]);	       return;	   }	}	else{	   if(!isdigit(*argv[1]))   /*is the pid a digit*/	   {	       printf("%s  argument must be a PID or %%jobid\n",argv[0]);	       return;	   }	   pid_t pid=(pid_t)atoi(argv[1]); 	   if((job=getjobpid(jobs, pid))==NULL)	   {	       printf("%s NO such process\n",argv[1]); 	       return;	   }	}	kill(-(job->pid),SIGCONT);   /*send a signal to the process and its child*/        if(!strcmp(argv[0],"bg"))	{            job->state=BG;         /*change state*/	    printf("[%d] (%d) %s",job->jid,job->pid,job->cmdline);           }        else	{            job->state=FG;        /*change state*/	    waitfg(job->pid,output_fd); /*wait the foreground process to terminate*/        }	return;}/*  * waitfg - Block until process pid is no longer the foreground process */void waitfg(pid_t pid, int output_fd){        struct job_t *job;        job=getjobpid(jobs,pid);        while((job!=NULL)&&job->state==FG)  /*if process pid foreground*/	{             sleep(1);         }        return;}/***************** * Signal handlers *****************//*  * sigchld_handler - The kernel sends a SIGCHLD to the shell whenever *     a child job terminates (becomes a zombie), or stops because it *     received a SIGSTOP or SIGTSTP signal. The handler reaps all *     available zombie children, but doesn't wait for any other *     currently running children to terminate.   */void sigchld_handler(int sig) {        struct job_t *job;	int status;	int jid;        pid_t pid;        while((pid=waitpid(-1,&status,WNOHANG|WUNTRACED))>0)	{	     job=getjobpid(jobs,pid);             if(WIFSTOPPED(status))    /*if the job stopped by signal*/	     {	          printf("Job [%d] (%d) stopped by signal %d\n",pid2jid(pid),pid,WSTOPSIG(status));	          job->state=ST;       /*change job state to stopped*/	     }	     else if(WIFEXITED(status))  /*if the job terminated normally*/	     {	          deletejob(jobs,pid);  /*delete the job from job list*/	     }	     else if(WIFSIGNALED(status)) /*if the job terminated by signal*/	     {	          if((jid=job->jid)>0)	                printf("Job [%d] (%d) terminated by signal %d\n",jid,pid,WTERMSIG(status));	          deletejob(jobs,pid); 	     }              }	        if(errno!=ECHILD&&errno!=EINTR)            unix_error("waitpid error");	return;}/*  * sigint_handler - The kernel sends a SIGINT to the shell whenver the *    user types ctrl-c at the keyboard.  Catch it and send it along *    to the foreground job.   */void sigint_handler(int sig) {        pid_t pid;        pid=fgpid(jobs);   /*get the foreground job*/	if(!pid)    /*if the foreground job exist*/	  return;        kill(-pid,SIGINT);     /*send signal SIGINT to the foreground process and its cild*/	return ;}/* * sigtstp_handler - The kernel sends a SIGTSTP to the shell whenever *     the user types ctrl-z at the keyboard. Catch it and suspend the *     foreground job by sending it a SIGTSTP.   */void sigtstp_handler(int sig) {	pid_t pid;        pid=fgpid(jobs);      /*get the foreground job*/	if(!pid)	  return;        kill(-pid,SIGTSTP);    /*send signal SIGTSTP to the foreground process and its cild*/	return;}/********************* * End signal handlers *********************//*********************************************** * Helper routines that manipulate the job list **********************************************//* clearjob - Clear the entries in a job struct */void clearjob(struct job_t *job) {	job->pid = 0;	job->jid = 0;	job->state = UNDEF;	job->cmdline[0] = '\0';}/* initjobs - Initialize the job list */void initjobs(struct job_t *jobs) {	int i;		for (i = 0; i < MAXJOBS; i++)		clearjob(&jobs[i]);}/* maxjid - Returns largest allocated job ID */int maxjid(struct job_t *jobs) {	int i, max=0;		for (i = 0; i < MAXJOBS; i++)		if (jobs[i].jid > max)			max = jobs[i].jid;	return max;}/* addjob - Add a job to the job list */int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline) {	int i;		if (pid < 1)		return 0;		for (i = 0; i < MAXJOBS; i++) {		if (jobs[i].pid == 0) {			jobs[i].pid = pid;			jobs[i].state = state;			jobs[i].jid = nextjid++;			if (nextjid > MAXJOBS)				nextjid = 1;			strcpy(jobs[i].cmdline, cmdline);			if(verbose){				printf("Added job [%d] %d %s\n", jobs[i].jid, jobs[i].pid, jobs[i].cmdline);			}			return 1;		}	}	printf("Tried to create too many jobs\n");	return 0;}/* deletejob - Delete a job whose PID=pid from the job list */int deletejob(struct job_t *jobs, pid_t pid) {	int i;		if (pid < 1)		return 0;		for (i = 0; i < MAXJOBS; i++) {		if (jobs[i].pid == pid) {			clearjob(&jobs[i]);			nextjid = maxjid(jobs)+1;			return 1;		}	}	return 0;}/* fgpid - Return PID of current foreground job, 0 if no such job */pid_t fgpid(struct job_t *jobs) {	int i;		for (i = 0; i < MAXJOBS; i++)		if (jobs[i].state == FG)			return jobs[i].pid;	return 0;}/* getjobpid  - Find a job (by PID) on the job list */struct job_t *getjobpid(struct job_t *jobs, pid_t pid) {	int i;		if (pid < 1)		return NULL;	for (i = 0; i < MAXJOBS; i++)		if (jobs[i].pid == pid)			return &jobs[i];	return NULL;}/* getjobjid  - Find a job (by JID) on the job list */struct job_t *getjobjid(struct job_t *jobs, int jid) {	int i;		if (jid < 1)		return NULL;	for (i = 0; i < MAXJOBS; i++)		if (jobs[i].jid == jid)			return &jobs[i];	return NULL;}/* pid2jid - Map process ID to job ID */int pid2jid(pid_t pid) {	int i;		if (pid < 1)		return 0;	for (i = 0; i < MAXJOBS; i++)		if (jobs[i].pid == pid) {			return jobs[i].jid;		}	return 0;}/* listjobs - Print the job list */void listjobs(struct job_t *jobs, int output_fd) {	int i;	char buf[MAXLINE];		for (i = 0; i < MAXJOBS; i++) {		memset(buf, '\0', MAXLINE);		if (jobs[i].pid != 0) {			sprintf(buf, "[%d] (%d) ", jobs[i].jid, jobs[i].pid);			if(write(output_fd, buf, strlen(buf)) < 0) {				fprintf(stderr, "Error writing to output file\n");				exit(1);			}			memset(buf, '\0', MAXLINE);			switch (jobs[i].state) {				case BG: 					sprintf(buf, "Running    ");					break;				case FG: 					sprintf(buf, "Foreground ");					break;				case ST: 					sprintf(buf, "Stopped    ");					break;				default:					sprintf(buf, "listjobs: Internal error: job[%d].state=%d ", 						i, jobs[i].state);			}			if(write(output_fd, buf, strlen(buf)) < 0) {				fprintf(stderr, "Error writing to output file\n");				exit(1);			}			memset(buf, '\0', MAXLINE);			sprintf(buf, "%s", jobs[i].cmdline);			if(write(output_fd, buf, strlen(buf)) < 0) {				fprintf(stderr, "Error writing to output file\n");				exit(1);			}		}	}	if(output_fd != STDOUT_FILENO)		close(output_fd);}/****************************** * end job list helper routines ******************************//*********************** * Other helper routines ***********************//* * usage - print a help message */void usage(void) {	printf("Usage: shell [-hvp]\n");	printf("   -h   print this message\n");	printf("   -v   print additional diagnostic information\n");	printf("   -p   do not emit a command prompt\n");	exit(1);}/* * unix_error - unix-style error routine */void unix_error(char *msg){	fprintf(stderr, "%s: %s\n", msg, strerror(errno));	exit(1);}/* * app_error - application-style error routine */void app_error(char *msg){	fprintf(stderr, "%s\n", msg);	exit(1);}/* * Signal - wrapper for the sigaction function */handler_t *Signal(int signum, handler_t *handler) {	struct sigaction action, old_action;		action.sa_handler = handler;  	sigemptyset(&action.sa_mask); /* block sigs of type being handled */	action.sa_flags = SA_RESTART; /* restart syscalls if possible */		if (sigaction(signum, &action, &old_action) < 0)		unix_error("Signal error");	return (old_action.sa_handler);}/* * sigquit_handler - The driver program can gracefully terminate the *    child shell by sending it a SIGQUIT signal. */void sigquit_handler(int sig) {	if (verbose)		printf("siquit_handler: terminating after receipt of SIGQUIT signal\n");	exit(1);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品日韩一区二区三区| 久久网站最新地址| 国产一区二区不卡| 亚洲精品视频一区二区| 日韩欧美中文字幕一区| www.在线欧美| 国产精品一卡二| 亚洲成人动漫av| 最好看的中文字幕久久| 日韩视频国产视频| 欧美日韩中文字幕一区| 成人美女视频在线看| 日本vs亚洲vs韩国一区三区二区| 日韩一区在线播放| 26uuu精品一区二区三区四区在线| 一本大道综合伊人精品热热| 国产精品一级二级三级| 老汉av免费一区二区三区| 亚洲第一电影网| 亚洲人成精品久久久久| 国产拍欧美日韩视频二区| 日韩视频免费直播| 欧美一区午夜精品| 精品1区2区3区| 91国产福利在线| 色激情天天射综合网| 成人福利视频在线看| 国产毛片精品视频| 国产自产视频一区二区三区| 喷白浆一区二区| 日本vs亚洲vs韩国一区三区二区| 亚洲第四色夜色| 午夜成人免费视频| 日日嗨av一区二区三区四区| 亚洲福利视频一区二区| 亚洲777理论| 午夜精品123| 三级成人在线视频| 蜜桃一区二区三区在线| 美女脱光内衣内裤视频久久网站 | 国产99久久久国产精品免费看| 裸体歌舞表演一区二区| 美女尤物国产一区| 久久99精品久久久| 麻豆国产精品一区二区三区| 久久成人综合网| 国产伦精一区二区三区| 成人激情av网| 99九九99九九九视频精品| 色婷婷狠狠综合| 欧美日韩国产一区二区三区地区| 欧美日韩国产小视频在线观看| 欧美男人的天堂一二区| 日韩一区二区精品葵司在线| 精品三级av在线| 中文字幕乱码亚洲精品一区| 中文字幕人成不卡一区| 亚洲国产成人av网| 久久国产精品一区二区| 国产成人午夜高潮毛片| 99re8在线精品视频免费播放| 色久优优欧美色久优优| 这里是久久伊人| 久久久99精品久久| 亚洲欧洲三级电影| 亚洲成人第一页| 国产一区二区精品在线观看| 91小视频在线| 欧美人狂配大交3d怪物一区| 精品国精品国产尤物美女| 国产精品理伦片| 亚洲va欧美va人人爽午夜| 国产在线看一区| 一本色道综合亚洲| 欧美一卡二卡在线观看| 国产日韩成人精品| 亚洲小说欧美激情另类| 国产麻豆精品久久一二三| 日本韩国精品一区二区在线观看| 欧美肥妇bbw| 国产精品视频一二| 天堂va蜜桃一区二区三区漫画版 | 99久久精品免费精品国产| 欧美日韩国产电影| 国产欧美日本一区视频| 图片区日韩欧美亚洲| 国产91丝袜在线播放0| 欧美日本不卡视频| 综合在线观看色| 欧美aa在线视频| 色综合久久六月婷婷中文字幕| 精品久久国产字幕高潮| 亚洲激情自拍视频| 国产伦精品一区二区三区视频青涩| 在线观看中文字幕不卡| 国产蜜臀av在线一区二区三区| 日韩中文字幕麻豆| 91麻豆精品在线观看| 精品国产欧美一区二区| 一区二区三区精品在线观看| 国产高清精品网站| 91精品国产色综合久久不卡电影 | 久久日一线二线三线suv| 亚洲福中文字幕伊人影院| 成人小视频免费在线观看| 日韩亚洲欧美一区二区三区| 亚洲卡通欧美制服中文| 成人性生交大片免费看中文网站 | 亚洲欧美日韩小说| 国产91对白在线观看九色| 欧美精品第1页| 亚洲精品视频在线观看免费| 成人激情文学综合网| 欧美精品一区二区三区在线播放| 午夜欧美大尺度福利影院在线看| av网站一区二区三区| 国产视频一区在线观看| 国产一区三区三区| 精品区一区二区| 日韩极品在线观看| 欧美日韩免费观看一区二区三区| 综合亚洲深深色噜噜狠狠网站| 成人午夜av在线| 国产三级欧美三级日产三级99 | 7777精品伊人久久久大香线蕉超级流畅 | 免费人成精品欧美精品| 欧美日韩精品二区第二页| 伊人色综合久久天天人手人婷| 97se亚洲国产综合自在线不卡| 国产日韩欧美麻豆| 国产98色在线|日韩| 国产欧美日韩视频一区二区| 国产成人自拍网| 久久久www成人免费毛片麻豆| 久久99久国产精品黄毛片色诱| 欧美精品久久久久久久多人混战| 亚洲国产一二三| 在线电影欧美成精品| 天堂成人免费av电影一区| 制服丝袜日韩国产| 蜜臀久久久久久久| 精品国一区二区三区| 久久综合综合久久综合| 久久美女高清视频| 盗摄精品av一区二区三区| 欧美国产日韩一二三区| 成人高清免费观看| 亚洲天堂久久久久久久| 在线观看三级视频欧美| 日韩中文字幕区一区有砖一区 | 亚洲欧洲日韩一区二区三区| 97se亚洲国产综合自在线观| 一区二区三区欧美激情| 欧美日韩一区二区三区高清 | 亚洲另类在线一区| 欧美性一区二区| 视频一区二区三区中文字幕| 日韩久久免费av| 丁香天五香天堂综合| 亚洲欧美另类综合偷拍| 欧美高清性hdvideosex| 狠狠色丁香婷婷综合久久片| 久久av资源网| 国产蜜臀av在线一区二区三区| 99精品国产视频| 秋霞午夜鲁丝一区二区老狼| 国产亚洲精品免费| 91福利精品视频| 久久超碰97中文字幕| 国产精品高清亚洲| 欧美日韩国产乱码电影| 黄色日韩三级电影| 亚洲精品国产一区二区精华液| 91精选在线观看| 懂色av一区二区夜夜嗨| 亚洲韩国一区二区三区| 久久这里只有精品首页| 91蜜桃视频在线| 国产在线一区观看| 亚洲国产精品天堂| 久久人人爽人人爽| 欧美日韩高清影院| 成人午夜在线视频| 久久精品国产亚洲高清剧情介绍 | 国产精品乱码一区二区三区软件| 91免费在线播放| 美女网站色91| 夜夜夜精品看看| 久久久久国产免费免费| 欧美日韩国产高清一区| gogogo免费视频观看亚洲一| 蜜桃av一区二区在线观看| 亚洲国产经典视频| 91精品久久久久久久99蜜桃 | 在线免费观看日本欧美| 国产精品自拍一区| 日韩av一二三| 亚洲在线一区二区三区| 国产视频亚洲色图| 日韩亚洲欧美中文三级|