当前位置:首页 > 操作系统实验指导书新 - 图文
}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)
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
共分享92篇相关文档