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

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

?? tsh.c.svn-base

?? os project / shell 程序
?? SVN-BASE
?? 第 1 頁 / 共 2 頁
字號:
/*  * tsh - A tiny shell program with job control *  * <Put your name and login ID here> *----------------- <Name : 武冰冰> ------------------ *----------------- <ID   :0461116 > ------------------ */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <ctype.h>#include <signal.h>#include <sys/types.h>#include <fcntl.h>#include <sys/wait.h>#include <errno.h>/* Misc manifest constants */#define MAXLINE    1024   /* max line size */#define MAXARGS     128   /* max args on a command line */#define MAXJOBS      16   /* max jobs at any point in time */#define MAXJID    1<<16   /* max job ID *//* Job states */#define UNDEF 0 /* undefined */#define FG 1    /* running in foreground */#define BG 2    /* running in background */#define ST 3    /* stopped *//*  * Jobs states: FG (foreground), BG (background), ST (stopped) * Job state transitions and enabling actions: *     FG -> ST  : ctrl-z *     ST -> FG  : fg command *     ST -> BG  : bg command *     BG -> FG  : fg command * At most 1 job can be in the FG state. *//* Global variables */extern char **environ;      /* defined in libc */char prompt[] = "tsh> ";    /* command line prompt */int verbose = 0;            /* if true, print additional output */int nextjid = 1;            /* next job ID to allocate */char sbuf[MAXLINE];         /* for composing sprintf messages */struct job_t {              /* The job struct */	pid_t pid;              /* job PID */	int jid;                /* job ID [1, 2, ...] */	int state;              /* UNDEF, BG, FG, or ST */	char cmdline[MAXLINE];  /* command line */};struct job_t jobs[MAXJOBS]; /* The job list *//* End global variables *//* Function prototypes *//* Here are the functions that you will implement */void eval(char *cmdline);int builtin_cmd(char **argv, int *input_fd, int *output_fd);void do_bgfg(char **argv, int output_fd);void waitfg(pid_t pid, int output_fd);void sigchld_handler(int sig);void sigtstp_handler(int sig);void sigint_handler(int sig);/* Here are helper routines that we've provided for you */int parseline(const char *cmdline, char **argv);char *firstTok(const char *space, const char *input,	const char *output, const char *pipe);void sigquit_handler(int sig);void clearjob(struct job_t *job);void initjobs(struct job_t *jobs);int maxjid(struct job_t *jobs); int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline);int deletejob(struct job_t *jobs, pid_t pid); pid_t fgpid(struct job_t *jobs);struct job_t *getjobpid(struct job_t *jobs, pid_t pid);struct job_t *getjobjid(struct job_t *jobs, int jid); int pid2jid(pid_t pid); void listjobs(struct job_t *jobs, int output_fd);void usage(void);void unix_error(char *msg);void app_error(char *msg);typedef void handler_t(int);handler_t *Signal(int signum, handler_t *handler);/* * main - The shell's main routine  */int main(int argc, char **argv) {	char c;	char cmdline[MAXLINE];	int emit_prompt = 1; /* emit prompt (default) */		/* Redirect stderr to stdout (so that driver will get all output	 * on the pipe connected to stdout) */	dup2(1, 2);	/* Parse the command line */	while ((c = getopt(argc, argv, "hvp")) != EOF) {		switch (c) {			case 'h':             /* print help message */            usage();				break;			case 'v':             /* emit additional diagnostic info */            verbose = 1;				break;			case 'p':             /* don't print a prompt */            emit_prompt = 0;  /* handy for automatic testing */				break;			default:            usage();		}	}		/* Install the signal handlers */	Signal(SIGINT,  sigint_handler);   /* ctrl-c */	Signal(SIGTSTP, sigtstp_handler);  /* ctrl-z */	Signal(SIGCHLD, sigchld_handler);  /* terminated or stopped child */	Signal(SIGQUIT, sigquit_handler);  /* so parent can cleanly terminate child*/		/* Initialize the job list */	initjobs(jobs);		/* Execute the shell's read/eval loop */	while (1) {				/* Read command line */		if (emit_prompt) {			printf("%s", prompt);                   			fflush(stdout);		}		if ((fgets(cmdline, MAXLINE, stdin) == NULL) && ferror(stdin))			app_error("fgets error");		if (feof(stdin)) { /* End of file (ctrl-d) */			fflush(stdout);			exit(0);		}				/* Evaluate the command line */		eval(cmdline);		fflush(stdout);		fflush(stderr);	} 		exit(0); /* control never reaches here */}/*  * eval - Evaluate the command line that the user has just typed in *  * If the user has requested a built-in command (quit, jobs, bg or fg) * then execute it immediately. Otherwise, fork a child process and * run the job in the context of the child. If the job is running in * the foreground, wait for it to terminate and then return.  Note: * each child process must have a unique process group ID so that our * background children don't receive SIGINT (SIGTSTP) from the kernel * when we type ctrl-c (ctrl-z) at the keyboard.   */void eval(char *cmdline) {        char *argv[MAXARGS];        int bg;       /*should the job run in bg or fg*/        pid_t pid;	sigset_t mask;        int in = STDIN_FILENO;	int out = STDOUT_FILENO;        int *input_fd = &in;        int *output_fd=&out;	int input=0;	int output=0;	int argc=0;         bg=parseline(cmdline,argv) ;        if (argv[0]==NULL)	   return;                          /*ignore empty line*/	while(argv[argc] !=NULL&&*argv[argc] !='\0')	{	     if(*argv[argc]=='<')                   /*is there input I\O redirection*/	     {	        if(in!=STDIN_FILENO)           /*illegal to use multiple redirection*/		{		    printf("Error: Ambiguous I/O redirection\n");  		    return;		}		else		{		    in=open(argv[argc+1],O_RDONLY);    /*open the specific file*/		    if(in==-1)		    {		       printf("Error: %s No such file or directory\n",argv[argc+1]);		       return;		    }		    else		       input=1;		}	     }	     	     if(*argv[argc]=='>')       /*is there output I\O redirection*/	     {	        if(out!=STDOUT_FILENO)         /*illegal to use multiple redirection*/		{		    printf("Error: Ambiguous I/O redirection\n");   		    return;		}		else		{		    out=open(argv[argc+1],O_WRONLY|O_CREAT); /*open the specific file*/		    output=1;		}		argv[argc]=NULL;	     }	     argc++;	}        if(!builtin_cmd(argv,input_fd,output_fd))      /*if the command a built-in command*/	{            sigemptyset(&mask);            sigaddset(&mask,SIGCHLD);            sigprocmask(SIG_BLOCK,&mask,NULL);     /*block signal SIGCHLD*/            if((pid=fork())==0)	    {               sigprocmask(SIG_UNBLOCK,&mask,NULL);    /*unblock signal SIGCHLD*/	       setpgid(0,0);                            /*pid is set for the job id*/	       	       if(input==1)	       {	           dup2(in,STDIN_FILENO);     /*job should read file from in instead of STDIN*/	       }	       if(output==1)	       {	           dup2(out,STDOUT_FILENO);  /*job should write to out in instead of STDOUT*/	       }               if(execve(argv[0],argv,environ)<0)      /*run user job in child process*/	       {                   printf("%s:Command not found.\n",argv[0]);                   exit(0);               }             }             addjob(jobs,pid,bg+1,cmdline);             /*add job to joblist*/             sigprocmask(SIG_UNBLOCK,&mask,NULL);       /*unblock signal SIGCHLD*/             if(!bg) /*run in foreground*/	     {                 waitfg(pid ,*output_fd);        /*wait for foreground job to terminate*/             }             else /*run in background*/	     {                 printf("[%d] (%d) %s",pid2jid(pid),pid,cmdline);             }        }        return;}/*  * parseline - Parse the command line and build the argv array. * Return true (1) if the user has requested a BG job, false  * if the user has requested a FG job. */int parseline(const char *cmdline, char **argv) {	static char array[MAXLINE]; /* holds local copy of command line */	char *buf = array;          /* ptr that traverses command line */	char *delim_space;          /* points to first space delimiter */	char *delim_in;             /* points to the first < delimiter */	char *delim_out;            /* points to the first > delimiter */	char *delim_pipe;           /* points to the first | delimiter */	char *delim;                /* points to the first delimiter */	int argc;                   /* number of args */	int bg;                     /* background job? */	char *last_space = NULL;    /* The address of the last space  */		strcpy(buf, cmdline);	buf[strlen(buf)-1] = ' ';  /* replace trailing '\n' with space */	while (*buf && (*buf == ' ')) /* ignore leading spaces */		buf++;		/* Build the argv list */	argc = 0;	delim_space = strchr(buf, ' ');	delim_in = strchr(buf, '<');	delim_out = strchr(buf, '>');	delim_pipe = strchr(buf, '|');	while ((delim = firstTok(delim_space, delim_in, delim_out, delim_pipe))) {		if(delim == delim_space) {			argv[argc++] = buf;			*delim = '\0';			last_space = delim;		} else if(delim == delim_in) {			if((last_space && last_space != (delim - 1)) || (!last_space)) {				argv[argc++] = buf;				*delim = '\0';			}			argv[argc++] = "<";			last_space = 0;		} else if(delim == delim_out) {			if((last_space && last_space != (delim - 1)) || (!last_space)) {				argv[argc++] = buf;				*delim = '\0';			}			argv[argc++] = ">";			last_space = 0;		} else if(delim == delim_pipe) {			if((last_space && last_space != (delim - 1)) || (!last_space)) { 				argv[argc++] = buf;				*delim = '\0';			}			argv[argc++] = "|";			last_space = 0;		}		buf = delim + 1;		while (*buf && (*buf == ' ')) /* ignore spaces */			buf++;		delim_space = strchr(buf, ' ');		delim_in = strchr(buf, '<');		delim_out = strchr(buf, '>');		delim_pipe = strchr(buf, '|');	}	argv[argc] = NULL;		if (argc == 0)  /* ignore blank line */		return 1;		/* should the job run in the background? */	if ((bg = (*argv[argc-1] == '&')) != 0)		argv[--argc] = NULL;	return bg;}/* * firstTok - Returns a pointer to the first (lowest addy) of the four pointers *     that isn't NULL. */char *firstTok(const char *space, const char *input,	const char *output, const char *pipe) {	const char *possible[4];	unsigned int min;	int i = 1, n = 0;	if(space == NULL && input == NULL && output == NULL && pipe == NULL)		return NULL;	if(space != NULL) {		possible[n++] = space;	}	if(input != NULL) {		possible[n++] = input;	}	if(output != NULL) {		possible[n++] = output;	}	if(pipe != NULL) {		possible[n++] = pipe;	}	min = (unsigned)possible[0];	for(;i<n;i++) {		if(((unsigned)possible[i]) < min)			min = (unsigned)possible[i];	}	return (char *)min;}/*  * builtin_cmd - If the user has typed a built-in command then execute *    it immediately.   */int builtin_cmd(char **argv, int *input_fd, int *output_fd) {        if(!strcmp(argv[0],"quit"))                 /*quit command, exit directly*/            exit(0);	if(!strcmp(argv[0],"&"))            return 1;	            if(!strcmp(argv[0],"jobs"))                /*jobs command ,list all jobs*/	{	    listjobs(jobs,*output_fd);            return 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产视频a| 亚洲综合精品久久| 麻豆91免费看| 久久久久亚洲蜜桃| 欧美一级片在线观看| 中文字幕欧美日本乱码一线二线| 26uuu国产日韩综合| 6080国产精品一区二区| 午夜精品久久久久久久| 国产一区三区三区| 色综合色综合色综合色综合色综合 | 久久综合九色综合97婷婷| 亚洲午夜精品17c| 色综合天天狠狠| 亚洲一区在线观看免费观看电影高清| 麻豆视频一区二区| 国产欧美日韩久久| 欧美在线观看禁18| 国产乱子轮精品视频| 国产精品女主播在线观看| 奇米精品一区二区三区在线观看| 欧美亚洲禁片免费| 日本免费新一区视频| 国产日韩欧美激情| 91精品国产综合久久香蕉麻豆| 天天色天天操综合| 夜夜爽夜夜爽精品视频| 欧美国产乱子伦| 久久一日本道色综合| 亚洲一区视频在线观看视频| 国产精品美女一区二区在线观看| 在线这里只有精品| 国产盗摄视频一区二区三区| 狠狠久久亚洲欧美| 樱桃视频在线观看一区| 国产麻豆精品视频| 99久久久久免费精品国产| 国产日韩欧美高清在线| 欧美一级高清片| 久久欧美一区二区| 中文字幕一区二区三区四区| 亚洲综合色婷婷| 精品系列免费在线观看| 精品一区二区三区免费毛片爱| 豆国产96在线|亚洲| 91麻豆精品国产自产在线观看一区| 日韩av一区二区三区四区| 亚洲图片你懂的| 另类小说视频一区二区| 国产成人啪免费观看软件| 色一区在线观看| 久久精品无码一区二区三区| 成人黄色大片在线观看| 欧美一区二区成人| 亚洲自拍偷拍综合| 欧美久久一二区| 日韩码欧中文字| 色伊人久久综合中文字幕| 丁香婷婷综合五月| 国产精品丝袜一区| av在线一区二区三区| 欧美午夜精品久久久久久超碰 | 欧美在线观看一区| 一区二区三区免费看视频| 国产精品卡一卡二卡三| 粉嫩在线一区二区三区视频| 国产欧美一区二区精品性| 国内久久婷婷综合| 欧美群妇大交群的观看方式 | 久久综合九色欧美综合狠狠| 图片区小说区国产精品视频| 欧美日韩免费一区二区三区| 色香蕉成人二区免费| 亚洲日本一区二区三区| 91国模大尺度私拍在线视频| 久久黄色级2电影| 亚洲人成在线播放网站岛国| 毛片av中文字幕一区二区| 欧美日韩www| 日韩精品亚洲一区| 91精品国产综合久久精品 | 国产在线视视频有精品| 欧美三级三级三级爽爽爽| 日韩av中文字幕一区二区| 日韩一区二区电影在线| 极品少妇xxxx精品少妇| 日韩一区二区免费高清| eeuss鲁片一区二区三区在线看| 国产一区二区三区av电影| 欧美激情一区二区| 欧美三区在线观看| 国产成人在线网站| 日韩国产欧美在线播放| 日韩精品视频网| 一区二区三区四区蜜桃 | 国产片一区二区三区| 国产精品欧美久久久久无广告| 亚洲特级片在线| 久久色在线观看| 欧美一级一级性生活免费录像| 国产suv精品一区二区883| 久久精品二区亚洲w码| 日韩在线一区二区三区| 一区二区三区加勒比av| 国产性色一区二区| 精品国产一二三| 在线电影一区二区三区| 欧美日韩国产精品自在自线| 91免费看视频| 色妹子一区二区| 日韩小视频在线观看专区| 99国产精品久久| 日韩视频一区二区在线观看| 国产网站一区二区三区| 亚洲.国产.中文慕字在线| 国产精品亚洲第一区在线暖暖韩国| 欧美日韩一级大片网址| 久久奇米777| 亚洲福利一区二区三区| 成人久久视频在线观看| 欧美日韩综合不卡| 亚洲视频免费在线| 成人一级黄色片| 精品国产乱码久久久久久浪潮| 亚洲视频一区二区在线观看| 日韩精品五月天| 久久99热国产| 日本高清不卡一区| 亚洲精品在线观看网站| 亚洲 欧美综合在线网络| 蜜臀va亚洲va欧美va天堂| 国产精选一区二区三区| 一本一道波多野结衣一区二区| 欧美精品久久一区二区三区| 亚洲人一二三区| 国产在线播放一区三区四| 色婷婷狠狠综合| 中文字幕乱码久久午夜不卡| 欧美日本在线一区| 亚洲视频你懂的| 99久久久久久| 久久久不卡影院| 国产大陆亚洲精品国产| 国产免费成人在线视频| 精品久久人人做人人爰| 欧美国产亚洲另类动漫| 亚洲一区欧美一区| 成人久久视频在线观看| 日韩精品一区二区三区中文不卡 | 国产剧情一区二区| 欧美一区二区三区日韩视频| 亚洲婷婷综合色高清在线| 国产成人综合网站| 久久久电影一区二区三区| 欧美日韩免费一区二区三区| 一区二区三区欧美日韩| 一本久道久久综合中文字幕 | 成人免费精品视频| 国产日韩欧美在线一区| 国产米奇在线777精品观看| 日韩一区二区三区在线| 天天av天天翘天天综合网 | 欧美精品免费视频| 亚洲午夜免费电影| 欧美日本国产一区| 日韩高清在线一区| 日韩精品一区二| 国产精品一区二区91| 中文字幕一区二区三区四区| 一本大道综合伊人精品热热 | 国产a区久久久| 国产精品成人一区二区艾草| 色综合亚洲欧洲| 日本中文一区二区三区| 久久久噜噜噜久久人人看| 不卡高清视频专区| 日韩 欧美一区二区三区| 久久你懂得1024| 色88888久久久久久影院野外| 亚洲v日本v欧美v久久精品| 欧美电影免费观看完整版 | 在线亚洲+欧美+日本专区| 麻豆成人久久精品二区三区红| 国产精品美女久久久久久2018| 日本精品视频一区二区三区| 另类的小说在线视频另类成人小视频在线 | 欧美大白屁股肥臀xxxxxx| 不卡一区二区中文字幕| 日韩精彩视频在线观看| 自拍偷拍欧美激情| 久久女同性恋中文字幕| 欧美一区二区三区喷汁尤物| 日本成人在线一区| 亚洲日本va午夜在线电影| 欧美国产精品一区| 久久夜色精品国产噜噜av| 337p亚洲精品色噜噜噜| 欧美综合一区二区| 成人动漫一区二区在线| 国产精品99久久久久|