实验题目要求:
1.编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程输出不同的内容。试观察记录屏幕上的显示结果,并分析原因。
2.修改上述程序,每一个进程循环显示一句话。子进程显示"daughter …"及"son ……",父进程显示"parent ……",观察结果,分析原因。
3.再调用exec( )用新的程序替换该子进程的内容 ,并利用wait( )来控制进程执行顺序。调用Exit()使子进程结束。
4.利用linux的信号量机制实现生产者-消费者问题。(基于进程)
实验1:
先用在终端中输入vim test01.c编辑程序(在vim中的编译操作可参见我的前一篇博客:Linux系统添加系统调用,其中有具体操作)
我最终的test01.c的程序如下图所示:
程序结果如下:(我多输出了几次编译后的a.out程序,仔细观察可以发现每次执行结果中进程的执行顺序是不定的,且进程对应的进程标识符 即程序中输出的ID号 也不相同)
分析:
(1)首先了解一下fork()函数:
一个现有进程可以调用fork函数创建一个新进程。该函数定义如下:#include
pid_t fork(void);// 返回:若成功则在子进程中返回0,在父进程中返回子进程ID,若出错则返回-1
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;
在子进程中,fork返回0;
如果出现错误,fork返回一个负值;
因此,可以通过返回值来判断当前是父进程还是子进程。
(2)其次,关于pid的值在父子进程中不同的原因,其实就相当于链表,进程形成了链表,父进程的pid(p 意味着point)指向子进程的进程ID,因为子进程没有子进程,所以它的pid为0。
(3)这次实验中每次输出结果中的顺序不一样的原因:
一般来说,在fork之后的父进程先执行还是子进程先执行是不确定的,取决于内核的调度算法,相互之间没有任何时序上的关系。所以在没有加入进程同步机制的代码的情况下,父进程与子进程的输出内容会叠加在一起,由此导致每次运行的结果之后出现了不一样的运行结果。
具体fork函数的创建过程及解析可参看:
实验2:
因为是在实验1的基础上进行的,所以,操作步骤与实验1差不多。
我的实验2的程序如下:
程序执行结果:
多次输出编译后的a.out程序,同样可以看到执行的顺序也是不定的,且进程的ID号也不相同。
分析:
我认为