📄 jobs.h
字号:
J_OUTPUT_JOB_HEAD->j_next = NULL;
J_OUTPUT_JOB_HEAD->j_length = 0;
}
else
{
J_OUTPUT_JOB_HEAD->j_next = deletejcb->j_next;
J_OUTPUT_JOB_HEAD->j_length--;
}
/* 释放JCB控制块 */
free(deletejcb);
/* 重新显示输出井的作业队列*/
M_G_DISPLAY_OUTPUT_QUEUE();
M_G_DISPLAY_OR_CLEAN_SYSTEM_MEMORY(0,0);
M_G_DISPLAY_OR_CLEAN_DATA_FROM_SYSTEM_BUF_TO_PRINTER(0);
M_PROCESS_SLEEP_SETTING(RUNNING_QUEUE->p_next,-1);
M_SET_SYSTEM_PROCESS_STATUS(RUNNING_QUEUE->p_next,Ready);
flag = TRUE;
}
}/* end of switch */
}/* end of while */
}
/****************************************************************************
模块名称: 预输入模块
函 数 名: READ_LINE_FROM_KEYBOARD_TO_MEMORY
功 能: 从用户键盘中读入数据到内存
入口参数: (FILE *fp)用户作业文件指针 (long *offset)偏移量指针 (char *p)缓冲区指针
出口参数: 返回读到的字符数
调用关系: 被INPUT_PROCESS调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-7
完成日期: 2003-10-7
*****************************************************************************/
int READ_LINE_FROM_KEYBOARD_TO_MEMORY(FILE *fp,long *offset,char *pb)
{
char c=0;
int n=0;
/* 移动文件读写指针到指定的位置*/
fseek(fp,*offset,0);
/* 读入一个字符 */
c=fgetc(fp);
/* 如果该字符不是回车换行符,同时不是文件末,一直循环 */
while(c!=LINEEND && c!=EOF)
{
/* 将读到的字符存放到PB所指的内存缓冲区中*/
*pb=c;
/* 将内存缓冲区指针后移一个单位长度*/
pb++;
/* n 表示读到的字符数,当读到一个字符之后 n 加1 */
n++;
/* 继续读取下一个字符,直到回车换行符或是文件结束符 */
c=fgetc(fp);
}
/* 给读到的字符串加上结束标志*/
*pb='\0';
/* 获得当前文件的读写指针的位置,为下一次读写作准备*/
*offset=ftell(fp);
/* 返回读到的字符数*/
return(n);
}
/****************************************************************************
模块名称: 预输入模块
函 数 名: M_DEAL_KEYBOARD_TO_SYSTEM_MEMORY
功 能: 从用户键盘中读入数据到系统内存
入口参数: (FILE *fp)用户作业文件指针 (long *offset)偏移量指针 (char *p)缓冲区指针
出口参数: 返回读到的字符数
调用关系: 被INPUT_PROCESS调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-7
完成日期: 2003-10-7
*****************************************************************************/
M_DEAL_KEYBOARD_TO_SYSTEM_MEMORY(FILE *fp,long *offset,char *w)
{
int i=0,read_chars;
/* 从(存于真正硬盘)用户作业文件中读入用户作业数据,并将读到的字符数返回给read_chars */
read_chars=READ_LINE_FROM_KEYBOARD_TO_MEMORY(fp,offset,w);
if(read_chars <= 0)
return(0);
while(read_chars > 0 && i<10)
{
/* 将从键盘读到的数据写入系统存取区的输入井缓冲区 */
strcpy(&SYSTEM_INPUT_BUF[i][0],w);
i++;
if(i == 10)
break;
else
{
/* 从(存于真正硬盘)用户作业文件中读入用户作业数据,并将读到的字符数返回给read_chars */
read_chars=READ_LINE_FROM_KEYBOARD_TO_MEMORY(fp,offset,w);
}
}
return(i-1);
}
/****************************************************************************
模块名称: 预输入模块
函 数 名: M_BUILD_JOB_PCB_AND_JOIN_INTO_READY_QUEUE
功 能: 为作创建进程控制块,并将其移动到正在处理作业队列中
入口参数:
出口参数:
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-7
完成日期: 2003-10-7
*****************************************************************************/
M_BUILD_JOB_PCB_AND_JOIN_INTO_READY_QUEUE()
{
PCB *newjob,*p;
int i,j;
newjob = (PCB*)malloc(sizeof(PCB));
if(newjob == NULL)
{
/* 无法建立PCB控制块 */
}
/* 将作业的有关信息写入到PCB控制块中 */
/* 初始化刚才申请的结点 */
/* 作业名称 */
strcpy(newjob->p_name,J_INPUT_JOB_HEAD->j_next->j_name);
/* 作业运行估计时间 */
strcpy(newjob->p_runtime,J_INPUT_JOB_HEAD->j_next->j_runtime);
/* 作业输出估计行数 */
strcpy(newjob->p_outputline,J_INPUT_JOB_HEAD->j_next->j_output_line);
/* 进程当前计数器指针为 0 */
newjob->p_pc = 0;
/* 复位进程状态寄中存器 */
newjob->p_c = 'F';
/* 复位通用寄存器 */
newjob->p_r = 0;
/* 进程基址指向内存空闲首地址 */
/* newjob->p_base = PAGE_OF_MEMORY[i].base; */
/* 进程占用内存长度 */
newjob->p_length = J_INPUT_JOB_HEAD->j_next->j_length;
newjob->p_color = J_INPUT_JOB_HEAD->j_next->j_color;
/* 进程程序段起始位置为 0 */
newjob->p_prog_start = J_INPUT_JOB_HEAD->j_next->j_p_start;
/* 进程数据段起始位置为 0 */
newjob->p_data_start = J_INPUT_JOB_HEAD->j_next->j_d_start;
newjob->p_prog_end = J_INPUT_JOB_HEAD->j_next->j_p_end;
newjob->p_data_end = J_INPUT_JOB_HEAD->j_next->j_d_end;
/* 置该进程为用户进程 */
newjob->p_type = 'U';
/* 置进程状态为就绪状态 */
newjob->p_status = Ready;
/* 为进程分配时间片 */
newjob->p_tick = TIMESLICE;
/* 复位进程中断状态寄存器 */
newjob->p_int_status = 0;
/* 为进程分配ID号,每一个进程的ID号都不相同,且为唯一的 */
newjob->p_id = ID++;
J_INPUT_JOB_HEAD->j_next->j_id = newjob->p_id;
/* 进程装载入内存时占用内存页表的下标*/
/* newjob->p_page_of_memory = i; */
/* 复位进程已占用CPU的时间*/
newjob->p_running_time = 0;
/* 复位进程已输出数据行数*/
newjob->p_output_lines = 0;
/* 占用输入井作业表的下标 */
/* newjob->p_index = J_INPUT_JOB_HEAD->j_next->j_index; */
/* 进程输出数据时,显示在输出表格中的位置(下标) */
/* newjob->p_output_information_line = OUT_INFORMATION_LINE; */
/* 清除进程错误标志 */
newjob->p_error = -1;
/* 清空输出缓冲区 */
for(i=0;i<10;i++)
for(j=0;j<5;j++)
newjob->p_print[i][j]='\0';
/* 复制作业页表*/
for(i=0;i<10;i++)
newjob->p_job_table[i] = J_INPUT_JOB_HEAD->j_next->j_job_table[i];
/* 将该作业加入到正在处理的作业队列中 */
M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB();
/* 将进程加入到用户就绪队列中 */
p=READY_QUEUE;
while(p->p_next!=NULL)
p=p->p_next;
newjob->p_next = p->p_next;
p->p_next = newjob;
/* 就绪队列的进程数加 1 */
READY_QUEUE->p_tick++;
}
/****************************************************************************
模块名称: 预输入模块
函 数 名: M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB
功 能: 将作业移动到正在处理作业队列中
入口参数:
出口参数:
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-7
完成日期: 2003-10-7
*****************************************************************************/
M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB()
{
/* 将该作业加入到正在处理的作业队列中 */
J_DEALING_JOB_TAIL->j_next = J_INPUT_JOB_HEAD->j_next;
if(J_INPUT_JOB_HEAD->j_next == J_INPUT_JOB_TAIL)
{
/* 已经是最后一个结点了 */
J_INPUT_JOB_HEAD->j_next = J_INPUT_JOB_HEAD->j_next->j_next;
J_INPUT_JOB_TAIL = J_INPUT_JOB_HEAD;
}
else
{
/* 删除第一个结点 */
J_INPUT_JOB_HEAD->j_next = J_INPUT_JOB_HEAD->j_next->j_next;
}
J_DEALING_JOB_TAIL = J_DEALING_JOB_TAIL->j_next;
J_DEALING_JOB_TAIL->j_next = NULL;
}
/****************************************************************************
模块名称: 预输入模块
函 数 名: M_PRINT_ONE_LINE_OF_JOB_RESULT
功 能: 模拟打印机打印一行数据
入口参数: char *p 要打印数据的首地址
int no 要打印的数据类型
出口参数:
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-7
完成日期: 2003-10-7
*****************************************************************************/
M_PRINT_ONE_LINE_OF_JOB_RESULT(char *p,int no)
{
char *buf,tempbuf[10];
int size,i;
G_POINT s,e;
s.x = print_left+1;
s.y = print_top+print_height - (print_height/13-1)*13;
e.x = print_left+print_width-1;
e.y = s.y + (print_height/13-1)*13;
/* 计算保存图形的缓冲区的大小 */
size = imagesize(s.x,s.y,e.x,e.y);
/* 申请缓冲区 */
buf = malloc(size);
/* 保存屏幕内容 */
getimage(s.x,s.y,e.x,e.y,buf);
putimage(s.x,s.y-13,buf,COPY_PUT);
free(buf);
setfillstyle(1,0);
bar(print_left+1,print_top+print_height-13,print_left+print_width-1,print_top+print_height-1);
/* 采用上移的方式打印出数据 */
setcolor(J_OUTPUT_JOB_HEAD->j_next->j_color);
if(no == 0)
{
if(*p == '!')
{
/* 表示要打印的该行是出错信息 */
outtextxy(print_left+1,print_top+print_height-13+2,J_OUTPUT_JOB_HEAD->j_next->j_name);
for(i=0;i<2;i++)
DRAWMAT(error_info+i*24,12,print_left+1+32+i*12,print_top+print_height-13,yellow_color);
itoa(J_OUTPUT_JOB_HEAD->j_next->j_error,tempbuf,10);
outtextxy(print_left+1+32+24,print_top+print_height-13+2,tempbuf);
for(i=0;i<2;i++)
DRAWMAT(error_info+(i+4)*24,12,print_left+1+32+24+8+8+i*12,print_top+print_height-13,yellow_color);
if(J_OUTPUT_JOB_HEAD->j_next->j_error_row == 100)
itoa(1,tempbuf,10);
else
itoa(J_OUTPUT_JOB_HEAD->j_next->j_error_row+3,tempbuf,10);
outtextxy(print_left+1+32+24+8+8+24,print_top+print_height-13+2,tempbuf);
}
else
{
/* 打印作业运行的结果 */
outtextxy(print_left+1,print_top+print_height-13+2,p);
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -