From 989f92d903d519dbdcc98f524b045729602ef7c1 Mon Sep 17 00:00:00 2001 From: Ljl Date: Sun, 3 May 2015 09:40:04 +0800 Subject: [PATCH 1/3] Complete Task 9 --- job.c | 329 +++++++++++++++++++++++++++++++++++++++++++--------------- job.h | 62 ++++++----- 2 files changed, 282 insertions(+), 109 deletions(-) mode change 100755 => 100644 job.c mode change 100755 => 100644 job.h diff --git a/job.c b/job.c old mode 100755 new mode 100644 index 7dd256c..80e7c04 --- a/job.c +++ b/job.c @@ -18,66 +18,79 @@ int globalfd; struct waitqueue *head=NULL; struct waitqueue *next=NULL,*current =NULL; -/* 调度程序 */ +/* 璋冨害绋嬪簭 */ void scheduler() { struct jobinfo *newjob=NULL; struct jobcmd cmd; int count = 0; + //杩欎釜鍑芥暟鐨勪綔鐢ㄦ槸浠涔堬紵DATALEN鏄湪job.h閲屽畾涔夛紝涓簊izeof(struct jobcmd) bzero(&cmd,DATALEN); - if((count=read(fifo,&cmd,DATALEN))<0) + if((count=read(fifo,&cmd,DATALEN))<0)//count 鍙槸涓轰簡debug鐢紵 error_sys("read fifo failed"); #ifdef DEBUG - if(count){ printf("cmd cmdtype\t%d\ncmd defpri\t%d\ncmd data\t%s\n",cmd.type,cmd.defpri,cmd.data); } else printf("no data read\n"); -#endif +#endif - /* 更新等待队列中的作业 */ + /* 鏇存柊绛夊緟闃熷垪涓殑浣滀笟 */ updateall(); switch(cmd.type){ case ENQ: + #ifdef DEBUG_LJL_JOB + printf("In the 'ENQ' case\n"); + #endif do_enq(newjob,cmd); break; case DEQ: + #ifdef DEBUG_LJL_JOB + printf("In the 'DEQ' case\n"); + #endif do_deq(cmd); break; case STAT: + #ifdef DEBUG_LJL_JOB + printf("In the 'STAT' case\n"); + #endif do_stat(cmd); break; default: break; } - /* 选择高优先级作业 */ + /* 閫夋嫨楂樹紭鍏堢骇浣滀笟 */ next=jobselect(); - /* 作业切换 */ + #ifdef DEBUG_LJL_JOB + if(next) + printf("The selected job is %s\n",next->job->cmdarg[0]); + #endif + /* 浣滀笟鍒囨崲 */ jobswitch(); -} +} int allocjid() { return ++jobid; -} +} void updateall() { struct waitqueue *p; - /* 更新作业运行时间 */ + /* 鏇存柊浣滀笟杩愯鏃堕棿 */ if(current) - current->job->run_time += 1; /* 加1代表1000ms */ + current->job->run_time += 1; /* 鍔1浠h〃1000ms */ - /* 更新作业等待时间及优先级 */ + /* 鏇存柊浣滀笟绛夊緟鏃堕棿鍙婁紭鍏堢骇 */ for(p = head; p != NULL; p = p->next){ p->job->wait_time += 1000; if(p->job->wait_time >= 5000 && p->job->curpri < 3){ - p->job->curpri++; - p->job->wait_time = 0; + p->job->curpri++; + p->job->wait_time = 0; } } } @@ -90,32 +103,78 @@ struct waitqueue* jobselect() select = NULL; selectprev = NULL; if(head){ - /* 遍历等待队列中的作业,找到优先级最高的作业 */ - for(prev = head, p = head; p != NULL; prev = p,p = p->next) + /* 閬嶅巻绛夊緟闃熷垪涓殑浣滀笟锛屾壘鍒颁紭鍏堢骇鏈楂樼殑浣滀笟 */ + for(prev = head, p = head; p != NULL; prev = p,p = p->next){ if(p->job->curpri > highest){ select = p; selectprev = prev; highest = p->job->curpri; } - selectprev->next = select->next; - if (select == selectprev) - head = NULL; + } + selectprev->next = select->next; + //褰撳墠閫変腑鐨勪綔涓氬簲璇ユ槸鐙珛鐨勶紝杩欐牱鍦ㄦ斁鍏ョ瓑寰呴槦鍒楁椂涓嶄細寮曡捣浣滀笟涓㈠け + //select->next = NULL; + if (select == selectprev) + //绛夊緟闃熷垪涓彧鏈夊綋鍓嶄竴涓綔涓 + head = NULL; } return select; } void jobswitch() { + char timebuf[BUFLEN]; struct waitqueue *p; int i; - if(current && current->job->state == DONE){ /* 当前作业完成 */ - /* 作业完成,删除它 */ +//鎵цjobswitch鍓嶇殑淇℃伅 +#ifdef DEBUG_LJL_TASK9 + //褰撳墠杩涚▼淇℃伅 + printf("Before jobswitch, current:\n"); + if(current){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + strcpy(timebuf,ctime(&(current->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + current->job->jid, + current->job->pid, + current->job->ownerid, + current->job->run_time, + current->job->wait_time, + timebuf,"RUNNING"); + }else{ + printf("NULL\n"); + } + + //褰撳墠绛夊緟闃熷垪淇℃伅 + printf("Before jobswitch, waitqueue:\n"); + if(head){ + for(p=head;p!=NULL;p=p->next){ + strcpy(timebuf,ctime(&(p->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + timebuf, + "READY"); + } + }else{ + printf("NULL\n"); + } + +#endif + + + if(current && current->job->state == DONE){ /* 褰撳墠浣滀笟瀹屾垚 */ + /* 浣滀笟瀹屾垚锛屽垹闄ゅ畠 */ for(i = 0;(current->job->cmdarg)[i] != NULL; i++){ free((current->job->cmdarg)[i]); (current->job->cmdarg)[i] = NULL; } - /* 释放空间 */ + /* 閲婃斁绌洪棿 */ free(current->job->cmdarg); free(current->job); free(current); @@ -123,29 +182,39 @@ void jobswitch() current = NULL; } - if(next == NULL && current == NULL) /* 没有作业要运行 */ - - return; - else if (next != NULL && current == NULL){ /* 开始新的作业 */ - - printf("begin start new job\n"); + if(next == NULL && current == NULL) + /* 娌℃湁浣滀笟瑕佽繍琛 */ + { + ; + //return; + } + else if (next != NULL && current == NULL){ + /* 寮濮嬫柊鐨勪綔涓 */ + printf("start a new job\n"); current = next; - next = NULL; + next = NULL; current->job->state = RUNNING; kill(current->job->pid,SIGCONT); - return; + //return; } - else if (next != NULL && current != NULL){ /* 切换作业 */ - + else if (next != NULL && current != NULL){ + /* 鍒囨崲浣滀笟 */ printf("switch to Pid: %d\n",next->job->pid); kill(current->job->pid,SIGSTOP); current->job->curpri = current->job->defpri; current->job->wait_time = 0; current->job->state = READY; - - /* 放回等待队列 */ + //current->next = NULL; + + /* 鏀惧洖绛夊緟闃熷垪 */ + //涓轰粈涔堜笉淇敼current鐨刵ext鎸囬拡锛 if(head){ - for(p = head; p->next != NULL; p = p->next); + for(p = head; p->next != NULL; p = p->next){ + #ifdef DEBUG_LJL_JOB + printf("鏀惧洖绛夊緟闃熷垪鎵弿锛%d\n",p->job->jid); + #endif + + } p->next = current; }else{ head = current; @@ -155,10 +224,52 @@ void jobswitch() current->job->state = RUNNING; current->job->wait_time = 0; kill(current->job->pid,SIGCONT); - return; - }else{ /* next == NULL且current != NULL,不切换 */ - return; + //return; + }else{ /* next == NULL涓攃urrent != NULL锛屼笉鍒囨崲 */ + //return; } + +//鎵цjobswitch鍚庣殑淇℃伅 +#ifdef DEBUG_TASK9 + //褰撳墠杩涚▼淇℃伅 + printf("After jobswitch, current:\n") + if(current){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + strcpy(timebuf,ctime(&(current->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + current->job->jid, + current->job->pid, + current->job->ownerid, + current->job->run_time, + current->job->wait_time, + timebuf,"RUNNING"); + }else{ + printf("NULL\n"); + } + + //褰撳墠绛夊緟闃熷垪淇℃伅 + printf("After jobswitch, waitqueue:\n") + if(head){ + for(p=head;p!=NULL;p=p->next){ + strcpy(timebuf,ctime(&(p->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + timebuf, + "READY"); + } + }else{ + printf("NULL\n"); + } + +#endif + + return ; } void sig_handler(int sig,siginfo_t *info,void *notused) @@ -167,24 +278,33 @@ void sig_handler(int sig,siginfo_t *info,void *notused) int ret; switch (sig) { -case SIGVTALRM: /* 到达计时器所设置的计时间隔 */ - scheduler(); - return; -case SIGCHLD: /* 子进程结束时传送给父进程的信号 */ - ret = waitpid(-1,&status,WNOHANG); - if (ret == 0) - return; - if(WIFEXITED(status)){ - current->job->state = DONE; - printf("normal termation, exit status = %d\n",WEXITSTATUS(status)); - }else if (WIFSIGNALED(status)){ - printf("abnormal termation, signal number = %d\n",WTERMSIG(status)); - }else if (WIFSTOPPED(status)){ - printf("child stopped, signal number = %d\n",WSTOPSIG(status)); - } - return; - default: - return; + case SIGVTALRM: /* 鍒拌揪璁℃椂鍣ㄦ墍璁剧疆鐨勮鏃堕棿闅 */ + scheduler(); + return; + case SIGCHLD: /* 瀛愯繘绋嬬粨鏉熸椂浼犻佺粰鐖惰繘绋嬬殑淇″彿 */ + ret = waitpid(-1,&status,WNOHANG);//WNOHANG 鑻id鎸囧畾鐨勫瓙杩涚▼娌℃湁缁撴潫锛屽垯waitpid()鍑芥暟杩斿洖0锛屼笉浜堜互绛夊緟銆傝嫢缁撴潫锛屽垯杩斿洖璇ュ瓙杩涚▼鐨処D銆 + if (ret == 0)//pid鎸囧畾鐨勫瓙杩涚▼娌℃湁缁撴潫 + return; + //WIFEXITED锛氬瓙杩涚▼姝e父閫鍑猴紙"exit"鎴"_exit"锛夛紝姝ゅ畯杩斿洖闈0 + //WEXITSTATUS(status)锛氬綋WIFEXITED杩斿洖闈為浂鍊兼椂锛屽彲浠ョ敤杩欎釜瀹忔潵鎻愬彇瀛愯繘绋嬬殑杩斿洖鍊 + if(WIFEXITED(status)){ + //瀛愯繘绋嬫甯搁鍑轰簡 + current->job->state = DONE; + printf("normal termation, exit status = %d\n",WEXITSTATUS(status)); + //WIFSIGNALED(int status):濡傛灉瀛愯繘绋嬫槸鍥犱负淇″彿鑰岀粨鏉熷垯姝ゅ畯鍊间负鐪 + //WTERMSIG(status)锛氬綋WIFSIGNALED涓虹湡鏃讹紝鍙互鐢ㄨ繖涓畯鏉ュ彇寰楀彇寰楀瓙杩涚▼鍥犱俊鍙疯屼腑姝㈢殑淇″彿浠g爜 + }else if (WIFSIGNALED(status)){ + //瀛愯繘绋嬫槸鍥犱负淇″彿鑰岀粨鏉 + printf("abnormal termation, signal number = %d\n",WTERMSIG(status)); + //WIFSTOPPED锛氳嫢涓哄綋鍓嶆澶勪簬鏆傚仠鐘舵佺殑瀛愯繘绋嬭繑鍥炵殑鐘舵侊紝鍒欎负鐪 + //WSTOPSIG锛氬綋WIFSTOPPED涓虹湡鏃讹紝鍙氳繃杩欎釜瀹忔潵鍙栧緱浣垮瓙杩涚▼鏆傚仠鐨勪俊鍙风紪鍙 + }else if (WIFSTOPPED(status)){ + //瀛愯繘绋嬪綋鍓嶆澶勪簬鏆傚仠鐘舵 + printf("child stopped, signal number = %d\n",WSTOPSIG(status)); + } + return; + default: + return; } } @@ -198,7 +318,7 @@ void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd) sigemptyset(&zeromask); - /* 封装jobinfo数据结构 */ + /* 灏佽jobinfo鏁版嵁缁撴瀯 */ newjob = (struct jobinfo *)malloc(sizeof(struct jobinfo)); newjob->jid = allocjid(); newjob->defpri = enqcmd.defpri; @@ -233,7 +353,7 @@ void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd) #endif - /*向等待队列中增加新的作业*/ + /*鍚戠瓑寰呴槦鍒椾腑澧炲姞鏂扮殑浣滀笟*/ newnode = (struct waitqueue*)malloc(sizeof(struct waitqueue)); newnode->next =NULL; newnode->job=newjob; @@ -243,15 +363,15 @@ void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd) for(p=head;p->next != NULL; p=p->next); p->next =newnode; }else - head=newnode; + head=newnode; - /*为作业创建进程*/ - if((pid=fork())<0) - error_sys("enq fork failed"); + /*涓轰綔涓氬垱寤鸿繘绋*/ + if((pid=fork())<0) + error_sys("enq fork failed"); if(pid==0){ newjob->pid =getpid(); - /*阻塞子进程,等等执行*/ + /*闃诲瀛愯繘绋,绛夌瓑鎵ц*/ raise(SIGSTOP); #ifdef DEBUG @@ -260,9 +380,9 @@ void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd) printf("arglist %s\n",arglist[i]); #endif - /*复制文件描述符到标准输出*/ + /*澶嶅埗鏂囦欢鎻忚堪绗﹀埌鏍囧噯杈撳嚭*/ dup2(globalfd,1); - /* 执行命令 */ + /* 鎵ц鍛戒护 */ if(execv(arglist[0],arglist)<0) printf("exec failed\n"); exit(1); @@ -281,7 +401,7 @@ void do_deq(struct jobcmd deqcmd) printf("deq jid %d\n",deqid); #endif - /*current jodid==deqid,终止当前作业*/ + /*current jodid==deqid,缁堟褰撳墠浣滀笟*/ if (current && current->job->jid ==deqid){ printf("teminate current job\n"); kill(current->job->pid,SIGKILL); @@ -294,19 +414,35 @@ void do_deq(struct jobcmd deqcmd) free(current); current=NULL; } - else{ /* 或者在等待队列中查找deqid */ + else{ /* 鎴栬呭湪绛夊緟闃熷垪涓煡鎵綿eqid */ + #ifdef DEBUG_LJL_DEQ + printf("Task to delete is not current task\n"); + #endif select=NULL; selectprev=NULL; if(head){ - for(prev=head,p=head;p!=NULL;prev=p,p=p->next) + for(prev=head,p=head;p!=NULL;prev=p,p=p->next){ if(p->job->jid==deqid){ + //鍦ㄩ槦鍒椾腑鎵惧埌闇瑕佸垹闄ょ殑浣滀笟 select=p; selectprev=prev; break; } + } + if(select){ + //搴旇淇濊瘉鏄湪浣滀笟琚壘鍒扮殑鎯呭喌涓,鍗硈elect闈炵┖鐨勬椂鍊 selectprev->next=select->next; - if(select==selectprev) - head=NULL; + }else + { + #ifdef DEBUG_LJL_DEQ + printf("No task to delete\n"); + #endif + //娌℃湁瑕佸垹闄ょ殑浣滀笟 + return ; + } + if(select==selectprev) + //闃熷垪涓彧鏈夎繖涓綔涓 + head=NULL; } if(select){ for(i=0;(select->job->cmdarg)[i]!=NULL;i++){ @@ -319,24 +455,47 @@ void do_deq(struct jobcmd deqcmd) select=NULL; } } -} +} void do_stat(struct jobcmd statcmd) { struct waitqueue *p; char timebuf[BUFLEN]; /* - *打印所有作业的统计信息: - *1.作业ID - *2.进程ID - *3.作业所有者 - *4.作业运行时间 - *5.作业等待时间 - *6.作业创建时间 - *7.作业状态 + *鎵撳嵃鎵鏈変綔涓氱殑缁熻淇℃伅: + *1.浣滀笟ID + *2.杩涚▼ID + *3.浣滀笟鎵鏈夎 + *4.浣滀笟杩愯鏃堕棿 + *5.浣滀笟绛夊緟鏃堕棿 + *6.浣滀笟鍒涘缓鏃堕棿 + *7.浣滀笟鐘舵 */ - /* 打印信息头部 */ + /* 鎵撳嵃淇℃伅澶撮儴 */ +#ifdef DEBUG_LJL_STAT + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCURPRI\tSTATE\n"); + if(current){ + printf("%d\t%d\t%d\t%d\t%d\t\t%d\t%s\n", + current->job->jid, + current->job->pid, + current->job->ownerid, + current->job->run_time, + current->job->wait_time, + current->job->curpri, + "RUNNING"); + } + for(p=head;p!=NULL;p=p->next){ + printf("%d\t%d\t%d\t%d\t%d\t\t%d\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + p->job->curpri, + "READY"); + } +#else printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); if(current){ strcpy(timebuf,ctime(&(current->job->create_time))); @@ -349,7 +508,6 @@ void do_stat(struct jobcmd statcmd) current->job->wait_time, timebuf,"RUNNING"); } - for(p=head;p!=NULL;p=p->next){ strcpy(timebuf,ctime(&(p->job->create_time))); timebuf[strlen(timebuf)-1]='\0'; @@ -362,6 +520,7 @@ void do_stat(struct jobcmd statcmd) timebuf, "READY"); } +#endif } int main() @@ -372,25 +531,25 @@ int main() struct sigaction newact,oldact1,oldact2; if(stat("/tmp/server",&statbuf)==0){ - /* 如果FIFO文件存在,删掉 */ + /* 濡傛灉FIFO鏂囦欢瀛樺湪,鍒犳帀 */ if(remove("/tmp/server")<0) error_sys("remove failed"); } if(mkfifo("/tmp/server",0666)<0) error_sys("mkfifo failed"); - /* 在非阻塞模式下打开FIFO */ + /* 鍦ㄩ潪闃诲妯″紡涓嬫墦寮FIFO */ if((fifo=open("/tmp/server",O_RDONLY|O_NONBLOCK))<0) error_sys("open fifo failed"); - /* 建立信号处理函数 */ + /* 寤虹珛淇″彿澶勭悊鍑芥暟 */ newact.sa_sigaction=sig_handler; sigemptyset(&newact.sa_mask); newact.sa_flags=SA_SIGINFO; sigaction(SIGCHLD,&newact,&oldact1); sigaction(SIGVTALRM,&newact,&oldact2); - /* 设置时间间隔为1000毫秒 */ + /* 璁剧疆鏃堕棿闂撮殧涓1000姣 */ interval.tv_sec=1; interval.tv_usec=0; diff --git a/job.h b/job.h old mode 100755 new mode 100644 index 7082b14..c81ef6c --- a/job.h +++ b/job.h @@ -14,7 +14,17 @@ #undef DEBUG -#define BUFLEN 100 +//鐢ㄤ簬璋冭瘯鐨勫畯 +#define DEBUG_LJL +#ifdef DEBUG_LJL +//#define DEBUG_LJL_JOB +//#define DEBUG_LJL_ENQ +//#define DEBUG_LJL_DEQ +//#define DEBUG_LJL_STAT +#define DEBUG_LJL_TASK9 +#endif + +#define BUFLEN 100 #define GLOBALFILE "screendump" enum jobstate{ @@ -28,23 +38,27 @@ struct jobcmd{ enum cmdtype type; int argnum; int owner; - int defpri; - char data[BUFLEN]; + int defpri;//鍒濆浼樺厛绾 + char data[BUFLEN];//杩欎釜data鏄敤鏉ュ瓨浠涔堢殑锛熻繍琛屽弬鏁颁箞锛 }; +// #define DATALEN sizeof(struct jobcmd) +//淇敼鍛藉悕涔犳儻 +//typedef struct job_tag struct jobinfo; + struct jobinfo{ - int jid; /* 作业ID */ - int pid; /* 进程ID */ - char** cmdarg; /* 命令参数 */ - int defpri; /* 默认优先级 */ - int curpri; /* 当前优先级 */ - int ownerid; /* 作业所有者ID */ - int wait_time; /* 作业在等待队列中等待时间 */ - time_t create_time; /* 作业创建时间 */ - int run_time; /* 作业运行时间 */ - enum jobstate state; /* 作业状态 */ + int jid; /* 浣滀笟ID */ + int pid; /* 杩涚▼ID */ + char** cmdarg; /* 鍛戒护鍙傛暟 */ + int defpri; /* 榛樿浼樺厛绾 */ + int curpri; /* 褰撳墠浼樺厛绾 */ + int ownerid; /* 浣滀笟鎵鏈夎匢D */ + int wait_time; /* 浣滀笟鍦ㄧ瓑寰呴槦鍒椾腑绛夊緟鏃堕棿 */ + time_t create_time; /* 浣滀笟鍒涘缓鏃堕棿 */ + int run_time; /* 浣滀笟杩愯鏃堕棿 */ + enum jobstate state; /* 浣滀笟鐘舵 */ }; struct waitqueue{ @@ -52,17 +66,17 @@ struct waitqueue{ struct jobinfo *job; }; -void scheduler(); -void sig_handler(int sig,siginfo_t *info,void *notused); -int allocjid(); -void add_queue(struct jobinfo *job); -void del_queue(struct jobinfo *job); -void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd); -void do_deq(struct jobcmd deqcmd); -void do_stat(struct jobcmd statcmd); -void updateall(); -struct waitqueue* jobselect(); -void jobswitch(); +void scheduler(); //浣滀笟璋冨害鍑芥暟 +void sig_handler(int sig,siginfo_t *info,void *notused);//淇″彿澶勭悊鍑芥暟 +int allocjid();//鍒嗛厤浣滀笟ID +void add_queue(struct jobinfo *job);//鍚戠瓑寰呴槦鍒椾腑娣诲姞浣滀笟 +void del_queue(struct jobinfo *job);//鍒犻櫎浣滀笟 +void do_enq(struct jobinfo *newjob,struct jobcmd enqcmd);//鎵ц鍏ラ槦鎿嶄綔 +void do_deq(struct jobcmd deqcmd);//鎵ц鍑洪槦鎿嶄綔 +void do_stat(struct jobcmd statcmd);//瀹炶stat鍛戒护 +void updateall();//鏇存柊绛夊緟闃熷垪涓悇涓綔涓氱殑淇℃伅 +struct waitqueue* jobselect();//浠庣瓑寰呴槦鍒椾腑閫夊彇涓嬩竴涓綔涓 +void jobswitch();//浣滀笟杞浆 void error_doit(int errnoflag,const char *fmt,va_list ap); void error_sys(const char *fmt,...); From 7f03d77e49a31f8242a52871540ee86c7a494474 Mon Sep 17 00:00:00 2001 From: Ljl Date: Sun, 3 May 2015 10:37:08 +0800 Subject: [PATCH 2/3] Complete Task9 --- job.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/job.c b/job.c index 80e7c04..d47298b 100644 --- a/job.c +++ b/job.c @@ -149,6 +149,7 @@ void jobswitch() //褰撳墠绛夊緟闃熷垪淇℃伅 printf("Before jobswitch, waitqueue:\n"); if(head){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); for(p=head;p!=NULL;p=p->next){ strcpy(timebuf,ctime(&(p->job->create_time))); timebuf[strlen(timebuf)-1]='\0'; @@ -161,6 +162,19 @@ void jobswitch() timebuf, "READY"); } + }else if(next){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + p = next; + strcpy(timebuf,ctime(&(p->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + timebuf, + "READY"); }else{ printf("NULL\n"); } @@ -230,9 +244,9 @@ void jobswitch() } //鎵цjobswitch鍚庣殑淇℃伅 -#ifdef DEBUG_TASK9 +#ifdef DEBUG_LJL_TASK9 //褰撳墠杩涚▼淇℃伅 - printf("After jobswitch, current:\n") + printf("After jobswitch, current:\n"); if(current){ printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); strcpy(timebuf,ctime(&(current->job->create_time))); @@ -249,8 +263,9 @@ void jobswitch() } //褰撳墠绛夊緟闃熷垪淇℃伅 - printf("After jobswitch, waitqueue:\n") + printf("After jobswitch, waitqueue:\n"); if(head){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); for(p=head;p!=NULL;p=p->next){ strcpy(timebuf,ctime(&(p->job->create_time))); timebuf[strlen(timebuf)-1]='\0'; From 6efb2cc4538d83d2121d5aab3efc3723769aa2e0 Mon Sep 17 00:00:00 2001 From: Ljl Date: Mon, 4 May 2015 01:03:24 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8D=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DemoForTask10 | Bin 0 -> 8569 bytes job.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 28 ++++++++++++++++-------- 3 files changed, 77 insertions(+), 9 deletions(-) create mode 100755 DemoForTask10 mode change 100755 => 100644 makefile diff --git a/DemoForTask10 b/DemoForTask10 new file mode 100755 index 0000000000000000000000000000000000000000..a402ed45a7736ba2edabb103507b172b769a65fe GIT binary patch literal 8569 zcmeHMU2GKB6}~&;KftWl6w(D+ylOx-sl2gWaF<4DX8p$)3>a7wRf!p|y<@!1{-E7i zViGmAVt!n7O9C8p-^l{Bq}I!tA_14ch2$7 zj+ZK`)IRyH_MUsbd%kney>suKxidfM>g`rM9>GZwKM<&$tI#B5=R%CtOO>#YSRpjA zNo*8VfKo|3UL)~X&Qf43xqsL<{71-NMA1M)T|*%{WnPqM zi>dF96~pot0dgdnP7z{=oxMHn9Y$-gHMkx8D)7S`lSlqwUP?`f+=loHtZO5Ep>9x? z@Y>>daq{~HWf7-4juWSV1E;Acs~R1+(@(Pl=edLged6;P{Z!>gs{%qlF>O`Obx819 z&5U%nm=(5P1(U*-YmnD9Xi!3Z6zk_dEkN3G33Uu{epc%5p^l-=PfPt*sAEX;zX84F zi=O<4hxPnzed4nReUYB)(^{1#^y^nK`uTfP4uJ^%FO( zM+18P1Dk)F_~S3uL%bqa-w({Ww;+=SIm3<%G|8SKA4@#2jdFt9c)hOoB(asYM> zurJIG%)begx&|?y1&Kajpaa*tKF0ylPj@}g^VjF*o)ijDUcmClSU%Oipr3-etylH@ zEc9~4TeX)XFf4Otp!U9U|K=Z{?YF^$5aE}@`9kjBsxRQ4g?sm{ zFAIfnkd4rIAINnu6c<5`g1iCp7DyjWYTPFc{&jEk2xyztz2H-8IZw1H_QOo(ka0%5Q3q|&jv zO6i7{?YbDi=b_%j`gX7HtkUK6pHaKKfzuUT-o~F*>fYv)Rk}AcQN72jCA^`qw>j)> zZ1)D*y?(H7_twb$@7F+|20zYqiY}Ma@(3)C!14$zkHGQ>{J%$_51y|uHItMIWc-ZD zvX(0R6`CxqCcU%D*4LBH=c|pR!!1;%4J7?^p5k*J*Z=)VA&n;I6%EDWnXg&3bw2A% zDYm{6Y%sOkLf|<7liwBspZ}c+A2?-#$3aYd54JV?e1dp2W{|#a3o%9QGd@W=$Ib1* zL%d9^!);#nXPoTe5l8ACvU@;!hUy9ap9?<6x*Iw~*L8&CF_I@qy6ty%bbLS1*gup@ zS-HTrU?|wy)UqQd)t0R`AVe^GJZVLTKw24Fj&doUvdqj;5lp2mGZ=2~X|ke6NIR0s z1&4BRIBLdYB8b{(G&?GSvEwQ5XG<$%*Bmo5*?2ltq8Lz@F%wZFQ0ZvG62W*X4!LEH zK|TTs)TLulD=LEKs4CQV~B23*!`h7rwVqQ`9pmwz-2X5c-Vj1NQ8X>bTxP_|-w z9Li=za5$YznkmaYbpMr(>j~!$&)blqfmVE-gj}Y zck|BxhH+thnD{>6rwh&dyIpI?%4L*!_&fO;?JFAbgN4^e;|CwpKX>;HrTV%&dxt%XS^qT8N^L)u_gfIni*s5lby zH#;yaGM^=W4&b((rU`DJ4XM(lN`E}}o%{vbxSHw0eG@91;LrWxeGS)Vx%L|yY;XHr z&fV?XR^@XQq6;b7l1dd;Yosi$3acz$vH1Mzbf&`7>{MC%D#7=mQu}Jb_m@(c#IvrMOq{K3a;`3Em$|aUXo=(43Gg ztD;`;e&(!H;f*|>Cra_J3EqE7@wKp@3_2lMR^c?j`-QVo70(FX2TE~x`selSs8Hc_ z!Ryum!@OJ%>u}Hs$+9ZkcSU<$Rfxagax6)B&-K7tLU;Ulu2RHmFoNs+xqe|gppcnORW=GK^T-IFd*YMH5EMN@uc0G&d&TNO&}1T4pTRw&Q!P;JJ*EfrnH3sA<6Q zF>_qlhtpUtnLG{@hi2fJw#2m4Os2cjnMgGIT1&Hxz576TPnXfPw-bW5d&1=sa!eSV zKinJM)6)S~jvD!qQy4pY_qB(6jeXtS2fHFhB;4NHh3@2c(BW)O#w?7U$R49OK#@Hi zI6RT)P{I^=F1Ejq$`7fU=KMx#nDW?6Uff?-UABh9mFv4JjAu4&j7C#2Xwm4|2MxyJ zDI=FPWAe+b+tXtB*kJ*q4WmFEHsA7u4Bdly7C=~Xf_L%-7uhwJha$%o(Cm8 Im!m2E4HQ*O3;+NC literal 0 HcmV?d00001 diff --git a/job.c b/job.c index d47298b..8eaee52 100644 --- a/job.c +++ b/job.c @@ -291,6 +291,10 @@ void sig_handler(int sig,siginfo_t *info,void *notused) { int status; int ret; +#ifdef DEBUG_LJL_TASK10 + char timebuf[BUFLEN]; + struct waitqueue *p = NULL; +#endif switch (sig) { case SIGVTALRM: /* 鍒拌揪璁℃椂鍣ㄦ墍璁剧疆鐨勮鏃堕棿闅 */ @@ -306,6 +310,60 @@ void sig_handler(int sig,siginfo_t *info,void *notused) //瀛愯繘绋嬫甯搁鍑轰簡 current->job->state = DONE; printf("normal termation, exit status = %d\n",WEXITSTATUS(status)); + //浠诲姟鍗 + #ifdef DEBUG_LJL_TASK10 + //褰撳墠杩涚▼淇℃伅 + printf("Current:\n"); + if(current){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + strcpy(timebuf,ctime(&(current->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + current->job->jid, + current->job->pid, + current->job->ownerid, + current->job->run_time, + current->job->wait_time, + timebuf,"RUNNING"); + }else{ + printf("NULL\n"); + } + + //褰撳墠绛夊緟闃熷垪淇℃伅 + printf("Waitqueue:\n"); + if(head){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + for(p=head;p!=NULL;p=p->next){ + strcpy(timebuf,ctime(&(p->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + timebuf, + "READY"); + } + }else if(next){ + printf("JOBID\tPID\tOWNER\tRUNTIME\tWAITTIME\tCREATTIME\t\tSTATE\n"); + p = next; + strcpy(timebuf,ctime(&(p->job->create_time))); + timebuf[strlen(timebuf)-1]='\0'; + printf("%d\t%d\t%d\t%d\t%d\t%s\t%s\n", + p->job->jid, + p->job->pid, + p->job->ownerid, + p->job->run_time, + p->job->wait_time, + timebuf, + "READY"); + }else{ + printf("NULL\n"); + } + + #endif + //WIFSIGNALED(int status):濡傛灉瀛愯繘绋嬫槸鍥犱负淇″彿鑰岀粨鏉熷垯姝ゅ畯鍊间负鐪 //WTERMSIG(status)锛氬綋WIFSIGNALED涓虹湡鏃讹紝鍙互鐢ㄨ繖涓畯鏉ュ彇寰楀彇寰楀瓙杩涚▼鍥犱俊鍙疯屼腑姝㈢殑淇″彿浠g爜 }else if (WIFSIGNALED(status)){ diff --git a/makefile b/makefile old mode 100755 new mode 100644 index 7e32a9c..c75fe5f --- a/makefile +++ b/makefile @@ -1,12 +1,22 @@ -job: job.c job.h error.c enq deq stat Demo - cc -o job job.c job.h error.c -enq: enq.c job.h error.c - cc -o enq enq.c job.h error.c -deq: deq.c job.h error.c - cc -o deq deq.c job.h error.c -stat: stat.c job.h error.c - cc -o stat stat.c job.h error.c +job: job.o job.h error.c enq deq stat Demo DemoForTask10 + cc -o job job.o job.h error.c +enq: enq.o job.h error.c + cc -o enq enq.o job.h error.c +deq: deq.o job.h error.c + cc -o deq deq.o job.h error.c +stat: stat.o job.h error.c + cc -o stat stat.o job.h error.c +job.o: job.c + cc -g -c job.c +enq.o: enq.c + cc -g -c enq.c +deq.o: deq.c + cc -g -c deq.c +stat.o: stat.c + cc -g -c stat.c Demo: Demo.c cc -o Demo Demo.c +DemoForTask10: DemoForTask10.c + cc -o DemoForTask10 DemoForTask10.c clean: - rm job enq deq stat Demo + rm job enq deq stat Demo job.o deq.o enq.o stat.o DemoForTask10