亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲美女淫视频| 国产精品久久久久久久久免费丝袜| 国产精品自拍毛片| 99re8在线精品视频免费播放| 日韩亚洲欧美一区二区三区| 亚洲线精品一区二区三区| 美女性感视频久久| 在线视频国产一区| 日本一区二区三区四区| 婷婷久久综合九色综合绿巨人| 国产成人精品免费在线| 欧美tk丨vk视频| 图片区小说区区亚洲影院| 91看片淫黄大片一级| 久久久www免费人成精品| 日韩av中文在线观看| 色av综合在线| 亚洲欧洲av在线| 国产精品一区二区久激情瑜伽| 欧美高清一级片在线| 一区二区三区在线视频播放| www.日韩在线| 国产精品三级视频| 成人一区二区三区在线观看| 日韩欧美国产电影| 日本不卡1234视频| 欧美日韩精品免费| 亚洲专区一二三| 色八戒一区二区三区| 一区二区三区中文在线| 色综合久久久久综合99| 综合久久国产九一剧情麻豆| 成人激情免费视频| 中文字幕第一页久久| 成人精品免费视频| 国产精品久久久久影院亚瑟| 成人福利视频网站| 国产精品―色哟哟| 成人激情黄色小说| 中文字幕免费不卡在线| 成人va在线观看| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美日韩国产成人在线91| 亚洲综合无码一区二区| 在线国产电影不卡| 天天av天天翘天天综合网色鬼国产| 欧美日韩国产综合一区二区| 免费成人在线影院| 国产日韩一级二级三级| 99视频精品在线| 亚洲午夜久久久久久久久电影网 | 国产三级一区二区| 国产精品一级二级三级| 国产精品麻豆网站| 91麻豆6部合集magnet| 亚洲成在人线在线播放| 51精品秘密在线观看| 狠狠色伊人亚洲综合成人| 欧美精彩视频一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 亚洲欧美日韩国产综合| 欧美猛男男办公室激情| 国产在线精品不卡| 国产精品色在线| 色欲综合视频天天天| 蜜臀91精品一区二区三区| 精品国产乱码久久久久久闺蜜 | 欧美亚洲高清一区二区三区不卡| 午夜av一区二区三区| 精品国产人成亚洲区| 5858s免费视频成人| 国产精品88888| 一区二区高清在线| 日韩免费高清视频| 91在线视频播放地址| 日本午夜精品视频在线观看| 亚洲欧洲一区二区三区| 4438x成人网最大色成网站| 国产大陆精品国产| 亚洲一级不卡视频| 久久久噜噜噜久久中文字幕色伊伊| 在线观看av一区二区| 九九国产精品视频| 午夜一区二区三区视频| 国产精品第一页第二页第三页| 欧美电影一区二区三区| 91影院在线免费观看| 国产一区二区三区精品欧美日韩一区二区三区 | 在线精品视频一区二区| 国产精品一二三四区| 日日夜夜精品视频天天综合网| 国产精品色哟哟| 久久综合久久久久88| 欧美一二三在线| 在线观看日韩精品| aaa国产一区| 国产成人日日夜夜| 极品少妇一区二区| 男人的天堂亚洲一区| 午夜成人免费电影| 亚洲国产精品一区二区久久| 亚洲日本成人在线观看| 国产欧美日韩亚州综合| 亚洲精品福利视频网站| 久久久国际精品| 精品日韩av一区二区| 91精品久久久久久久91蜜桃| 96av麻豆蜜桃一区二区| 国产一区 二区| 久久99精品视频| 中文字幕亚洲不卡| 国产亚洲欧美一级| 久久精品人人做人人爽人人| 日韩精彩视频在线观看| 香蕉影视欧美成人| 欧美日韩亚洲丝袜制服| 国产精品538一区二区在线| 欧美日韩电影在线播放| 欧美一区二区三区四区五区| 欧美一级一区二区| 欧美日韩一级片在线观看| 成人h动漫精品| 欧美日韩高清在线播放| 麻豆久久一区二区| 人人精品人人爱| 激情六月婷婷综合| 午夜欧美在线一二页| 亚洲欧美一区二区三区久本道91| 欧美日韩精品二区第二页| 亚洲亚洲人成综合网络| 91精品国产91热久久久做人人 | 91热门视频在线观看| 国产精品视频yy9299一区| 国产午夜三级一区二区三| 欧美一区二区视频在线观看 | 在线观看网站黄不卡| 日本韩国欧美在线| 欧美午夜精品久久久| 国产酒店精品激情| 色偷偷久久人人79超碰人人澡| 欧美丝袜丝nylons| 不卡一区在线观看| 欧美系列日韩一区| 久久精品一区二区三区四区| 最新国产成人在线观看| 国产亚洲污的网站| 亚洲精品视频一区二区| 国内精品国产三级国产a久久| 国产成人精品在线看| 69av一区二区三区| 国产精品传媒在线| 精品一区二区日韩| 欧美成人性战久久| 亚洲激情六月丁香| 久久精品视频一区| 5月丁香婷婷综合| 国产v综合v亚洲欧| 三级成人在线视频| 麻豆成人久久精品二区三区红 | 国产精品久久久久毛片软件| 日本韩国精品在线| 欧美剧情片在线观看| 国产大陆a不卡| 久久精品国产亚洲高清剧情介绍| 国产乱国产乱300精品| 国产精品一级在线| 99国产一区二区三精品乱码| 欧美在线你懂的| 亚洲精品免费电影| 成人黄色国产精品网站大全在线免费观看 | 欧美电影免费观看高清完整版 | 图片区日韩欧美亚洲| 色综合天天综合网天天狠天天| 亚洲欧洲日韩在线| 一本色道**综合亚洲精品蜜桃冫| 7777精品伊人久久久大香线蕉| 亚洲色欲色欲www| 色综合久久99| 亚洲午夜在线电影| 日韩一区二区在线播放| 麻豆91在线播放| 久久先锋影音av鲁色资源| 久久精品久久综合| 中文av字幕一区| 欧美一区二区三区系列电影| 国产一区二区不卡| 一区二区三区精密机械公司| 欧美三级午夜理伦三级中视频| 麻豆成人久久精品二区三区红| 国产三级一区二区| 7799精品视频| 日韩免费一区二区三区在线播放| 久久精品国产一区二区三| 国产欧美一区二区精品性| 欧美日韩国产综合久久| 成人美女视频在线观看| 国产一区欧美二区| 日本女人一区二区三区| 亚洲美女免费在线| 国产精品麻豆久久久|