第一范文网 - 专业文章范例文档资料分享平台

操作系统实验指导书新 - 图文

来源:用户分享 时间:2025/7/9 23:11:13 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

}while(n<0 || n>4); return(n); }

void enter(int q) {

int qq;

struct pcb *inf,*bc( ); if(q==1) {

inf=(struct pcb *)malloc(sizeof(stu)); /*开辟新结点*/ if(!inf){ printf(\ return; }

inputs(\请输入进程标识符(最多两位):\ inputs(\请输入进程优先数(最多两位):\ inputs(\请输入进程当前状态(一位):\ fir=bc(inf,fir); /*插入新结点*/ }

else

{for(qq=0;qq<4;qq++) /*结点初始化*/ {inf=(struct pcb *)malloc(sizeof(stu)); if(!inf){ printf(\ return; } strcpy(inf->name,str[qq*3]); strcpy(inf->number,str[qq*3+1]); strcpy(inf->status,str[qq*3+2]); fir=bc(inf,fir); } } }

inputs(sm,s,count) char *sm,*s; int count; {

char q[3]; do{

printf(sm); /*打印提示信息*/ gets(q);

if(strlen(q)>count) printf(\太长了!\\n\输入长度判断*/

43

}

while(strlen(q)>count);

strcpy(s,q); /*把输入内容放入结构中*/ }

struct pcb *bc(i,st) struct pcb *i; struct pcb *st; {

struct pcb *j,*k;

if(atoi(i->status)==0) /*判断进程状态是否就绪*/ {

if(back==NULL) /*链表为空时的插入*/ {

i->next=NULL; i->prior=NULL; back=i; return(i); }

j=st; /*令J指向链表的头*/ while(j)

{if(strcmp(j->name,i->name)==0) /*进程标识符要唯一*/ {printf(\该进程已存在就绪队列中。\\n\\n\ return(st); }

j=j->next; } j=st; k=NULL; while(j){

if(atoi(j->number)number)) /*判断进程优先数,找到要插入的位置*/ { k=j;

j=j->next; } else {

if(j->prior) /*判断J是否为头指针*/ {

j->prior->next=i; /*在链表的中间插入*/ i->next=j;

i->prior=j->prior; j->prior=i; return(st);

44

}

i->next=j; /*在链表的头插入*/ i->prior=NULL; j->prior=i; return(i); } }

k->next=i; /*在链表的尾插入*/ i->next=NULL; i->prior=k; back=i; return(st); }

printf(\该进程不是就绪状态,不能插入就绪队列中。\\n\\n\return(st); }

void delete( ) {

struct pcb *in; char s[2];

printf(\请输入进程标识符:\gets(s); in=fir; while(in){

if(strcmp(s,in->name)==0) break; /*寻找要删除的进程*/ else in=in->next; }

if(in==NULL)

printf(\未找到此进程!\\n\if(in){ /*找到进程*/

if(fir==in) /*该进程为链表头时*/ {

fir=in->next;

if(fir) fir->prior=NULL; /*该链表删除进程结点后不为空*/ else back=NULL; } else{

in->prior->next=in->next;

if(in!=back) /*该进程不在链表尾*/ in->next->prior=in->prior; else back=in->prior; }

free(in); /*释放进程空间*/

45

} }

void prin( ) {

struct pcb *j; j=fir;

while(j){ /*显示所有进程的信息*/ printf(\printf(\printf(\printf(\j=j->next; } }

四.设计实验 1.实验要求

1) 编程实现父进程和子进程通过信号实现异步合作。使用用户自定义信号SIGUSRl

由父进程发给子进程,SIGUSR2由子进程发给父进程。父进程和子进程各自从终端接收一个字符串(也可安排别的更有意义的操作),完成后用kill调用发送信号。接收到信号之后,显示对方的进程号及其字符串。利用信号方式(signal(SIGCHLD,SIG_IDN))使父进程不必等待子进程结束,且不产生“ZOMBIE”。

2) 使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话:

child process 1 is sending a message! child process 2 is sending a message!

父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

2. 程序源代码(学生自行设计)

46

搜索更多关于: 操作系统实验指导书新 - 图文 的文档
操作系统实验指导书新 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c1w33r7glez6tzp933x2x_12.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top