资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
实验三、观察Linux进程的异步并发执行实验目的通过实验,使学生理解进程与程序的区别,加深对进程概念的理解;掌握进程并发执行的原 理,理解进程并发执行的特点,区分进程并发执行与串行执行;了解fork()系统调用的返 回值,掌握用fork()创建进程的方法;预习:实验指导书;实验环境: Linux系统,C语言实验内容及要求1. 编写一 C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使 父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显 示“I am son”,女儿进程执行时屏幕显示“I am daughter”。2. 多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为 止。记下这种情况,试简单分析其原因。3. 修改程序,利用nice ()改变各进程的优先级,观察不同情况下进程调度效果的 区别。4. 修改程序,在父、子进程中分别使用wait、exit等系统调用“实现”其同步推进, 多次反复运行改进后的程序,观察并记录运行结果。实验结果 (可续页)1、实现代码如下:#include #include #include #include int main(void)pid_t pid1;pid_t pid2;pid1=fork();if(pid10)printf(Error.NO.1 fock call failn);else if(pid1 = 0)printf(I am father.);elsepid2=fork();if(pid20)printf(Error.NO.2 fock call failn);else if(pid2 = 0)printf(I am son.”);elseprintf(I am daughter.);printf(Fork end.nn);exit(0);2、运行结果如下:(1) 首次出现:I am father.Fork end.I am son.I am daughter.Fork end.(2) 出现不同:I am father.Fork end.I am son.Fork end.I am daughter.Fork end.出现不同原因:函数fork()并不是进行进程切换,而是复制一个当前进程。父进程中, 操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid,所以下面的 if语句中pid0, pid=0的两个分支都不会执行。所以父进程中输出I am father.子进程在之后的某个时候得到调度,它的上下文被换入,占据CPU,操作系统对fork 的实现,使得子进程中fork调用返回0。所以在这个进程中pid=0。这个进程继续执行的过 程中,if语句中pid0不满足,但是pid=0是true。所以输出I am son.I am daughter.3、实验代码如下:#include #include #include #include int main(void)pid_t pidl;pid_t pid2;pid1=fork();if(pid10)printf(Error.NO.1 fock call failn);else if(pid1 = 0)nice (10);sleep (10);printf(I am father.);elsepid2=fork();if(pid20)wait(0);for (i=0;i5;i+)printf(I am father.n); sleep(1);else iffor (i=0;i5;i+)printf(I am son.n);sleep(1);elsefor (i=0;i5;i+)printf(I am daughter.n); sleep(1);exit(0);执行结果如下所示:I am daughter.I am daughter.I am daughter.I am daughter.I am daughter.I am son.I am son.I am son.I am son.I am son.I am father.I am father.I am father.I am father.I am father.(续前页)后记1.如何让子进程的执行代码有别于父进程?在父进程中,利用fork ()函数,并且在此之后,判断其返回值,根据其值执行不同 代码。如第一个实验中,子进程在之后的某个时候得到调度,它的上下文被换入,占据CPU, 操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程中pid=0。这个进 程继续执行的过程中,if语句中pid0不满足,但是pid=0是true。所以输出I am son.I am daughter.因此,可以根据fork ()函数来区别子进程和父进程。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号