赞
踩
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程输出不同的内容。试观察记录屏幕上的显示结果,并分析原因。
fork()返回值意义:
返回值<0,创建失败
返回值=0,在子进程中
返回值>0,在父进程中
vim fork1.c
进入编辑
结果如上图
分析:在调用fork()函数创建子进程后,父子进程的执行顺序由操作系统来决定。从进程并发执行来看,各种情况都有可能,这三个进程的输出顺序具有随机性。
修改上述程序,每一个进程循环显示一句话。子进程显示“duaghter…”及“son…”,父进程显示“parent…”,观察结果,分析原因。
再次进入fork1.c编辑
结果如上图
每个进程循环10次
分析:由于函数printf( )在输出字符串时不会被中断,所以,字符串内部字符顺序输出不变。由于进程并发执行的调度顺序和父子进程抢占处理机问题,循环输出字符串的顺序随着进程执行的不同而发生变化。
在调用exec()函数用新的程序替换该子进程的内容,并利用wait()函数来控制进程执行的顺序。调用exit()函数使子进程结束。
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。
有6种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数使得UNIX进程控制原语更加完善。用fork可以创建新进程,用exec可以执行新程序。exit函数和两个wait函数处理终止和等待终止。
系统调用exec()和fork()联合使用能为程序开发提供有力支持。用fork( )建立子进程,然后在子进程中使用exec(),这样就实现了父进程与一个与它完全不同子进程的并发执行。
等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait()将调用进程挂起,直至其子进程因暂停或终止而发来软件中断信号为止。如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回。
对于wait()
首先查找调用进程是否有子进程,若无,则返回出错码;
若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执行时间上,并释放子进程的进程表项;
若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。
该函数表示退出,传入的参数是程序退出时的状态,0表示正常退出,其他表示非正常他退出
结果如上图
分析:我们在使用了exec()函数后程序使用了ls的命令,列出/bin/目录下的文件信息,我们可以发现在使用wait()函数后,父进程永远将在其他的子进程完成之后才执行,程序在调用fork()函数建立一个子进程后,马上调用wait()函数,使父进程在子进程结束之前一直处于睡眠状态,所以在输出的结果中我们可以看到最后输出的将是父进程的信息。
我的很多操作都是根据这些题目在网上找博客看得,感觉对于进程的一些调度以及很多与进程有关的函数都不怎么懂,通过这次作业,我对于这些知识有了一点了解,但是有些知识还是处于略迷糊的状态,下次再加油弄懂。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。