操作系统代码.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:16 大小:130KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

操作系统代码.pdf

操作系统代码.pdf

预览

免费试读已结束,剩余 6 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1进程的创建test1.c#include<stdio.h>#include<unistd.h>intmain(){intp1,p2;while((p1=fork())==‐1);//创建进程P1if(p1==0)//子进程创建成功putchar('b');else{while((p2=fork())==‐1);//创建另一个子进程if(p2==0)//子进程创建成功putchar('c');elseputchar('a');//父进程执行}}运行结果bac或者bca结果分析:从进程的并发执行来看,输出bac,acb,等情况都是可能的。这是因为fork()函数创建进程的时间要多输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了’b’,而进程2和主程序的输出次序都是有随机性的,所以会出现上述结果。进程的控制test2.c#include<stdio.h>#include<unistd.h>intmain(){intp1,p2,i;while((p1=fork())==‐1);//创建进程P1if(p1==0)//子进程创建成功for(i=0;i<50;i++)printf("child%d\n",i);else{while((p2=fork())==‐1);//创建另一个子进程if(p2==0)//子进程创建成功for(i=0;i<50;i++)printf("son%d\n",i);elsefor(i=0;i<50;i++)printf("daughter%d\n",i);//父进程执行}}运行结果:child...son...daughter....daughter...等分析:由于函数printf()输出地字符串之间不会被中断,因此,字符串内部的字符输出顺序不会变。但是,由于进程并发执行时的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同发生变化。修改程序:test3.c#include<unistd.h>intmain(){intp1,p2,i;while((p1=fork())==‐1);if(p1==0){lockf(1,1,0);for(i=0;i<50;i++)printf("child%d\n",i);lockf(1,0,0);}else{while((p2=fork())==‐1);if(p2==0){lockf(1,1,0);for(i=0;i<50;i++)printf("son%d\n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50;i++)printf("daughter%d\n",i);lockf(1,0,0);}}}分析:大致与未上锁的输出结果相同,也是随着执行的时间不同结果顺序有所不同。这是因为上述程序在运行时,不同进程间不存在共享临界区资源,所以,加锁与不加锁效果相同。test4.c2软中断通信#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>voidwaiting(),stop();intwait_mark;intmain(){intp1,p2;while((p1=fork())==‐1);if(p1>0){while((p2=fork())==‐1);if(p2>0){printf("parent\n");wait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);kill(p2,17);wait(0);wait(0);printf("parentprocessiskilled!\n");exit(0);}else{printf("p2\n");wait_mark=1;signal(17,stop);waiting();lockf(1,1,0);printf("childprocess2iskilledbyparent!\n");lockf(1,0,0);exit(0);}}else{printf("p1\n");wait_mark=1;signal(