(1)熟悉在c语言源程序中使用linux所提供的系统调用界面的方法。 (2)理解同步的概念。
(3)使用系统调用wait()和exit(),实现父子进程同步。 【实验原理/实验基础知识】 一、同步
在多道系统中,一个进程相对于另一个进程的运行速度是不确定的,但相互合作的几个进程需要在某些情况下相互协调工作。
同步关系是指多个相互合作的进程,在某些情况下可能需要相互等待或相互交换信息,这种相互制约关系称为进程同步。 二、Linux中父进程等待子进程的同步
Linux中实现进程同步的两个系统调用为wait()和exit(),使用这两个系统调用实现父进程等待子进程的同步。具体实现方法是:子进程终止时执行exit()向父进程发终止信号,父进程使用wait()等待子进程的终止。 1.Wait()系统调用
功能:等待任意一个子进程终止 格式:pid_t wait( )
例:wait(0)等待任意子进程结束
返回值:
返回值≥0 表示有子进程终止,其值为终止子进程的pid号。 返回值=-1 表示无子进程终止。该进程阻塞,插入等待子进程终止的队列,当有子进程终止时被唤醒。
注意:等待多个子进程终止需要使用多个wait(),如果该进程没有创建自己的子进程就不能使用wait()。
所用头文件:# include < sys / wait.h >,# include < sys / types.h > 2.Exit()系统调用
为了及时回收进程所占用的资源并减少父进程的干预,Linux利用exit( )来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit( ),使子进程自我终止。
功能:终止进程,释放其所占有的资源,向父进程发终止信号。 格式:void exit(stat) 例:exit(0) 进程正常终止
返回值:无返回值
头文件: # include < stdlib.h >
【实验环境】VMware Workstation、RedHat 【实验步骤】
(1) 使用vi编写程序,通过wait()和exit()实现父子进程同步,其同步方式
为父进程等待子进程的同步,即:子进程先循环输出5次,然后父进程再循环输出5次。 (2) 使用gcc编译程序。 (3) 运行程序。 (4) 观察结果。 【实验报告】 #include main() { int p1,i; while ((p1=fork())==-1); if (p1>0) { wait(0); for (i=0;i<5;i++) { printf(\"I am parent.\\n\"); sleep(1); } } else } { } for (i=0;i<5;i++) { printf(\"I am child.\\n\"); sleep(1); } exit(0); 填写《信息技术学院学生上机实验报告》。 【思考题】 (1) 什么是同步? (2) 实验中如何实现父子进程同步? 因篇幅问题不能全部显示,请点此查看更多更全内容