Linux创建两个生产者进程,操作系统——Linux进程创建及同步实验

实验题目要求:

1.编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程输出不同的内容。试观察记录屏幕上的显示结果,并分析原因。

2.修改上述程序,每一个进程循环显示一句话。子进程显示"daughter  …"及"son  ……",父进程显示"parent  ……",观察结果,分析原因。

3.再调用exec( )用新的程序替换该子进程的内容 ,并利用wait( )来控制进程执行顺序。调用Exit()使子进程结束。

4.利用linux的信号量机制实现生产者-消费者问题。(基于进程)

实验1:

先用在终端中输入vim test01.c编辑程序(在vim中的编译操作可参见我的前一篇博客:Linux系统添加系统调用,其中有具体操作)

我最终的test01.c的程序如下图所示:

09d7ff5c3e1efd73fe411f34d19b5a8d.png

程序结果如下:(我多输出了几次编译后的a.out程序,仔细观察可以发现每次执行结果中进程的执行顺序是不定的,且进程对应的进程标识符 即程序中输出的ID号 也不相同)

71d50f4cf332d65ce9966cba5fd1eaf2.png

分析:

(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的程序如下:

fcca86f98dd1765d471b318e671e2889.png

程序执行结果:

35b4130ee20554cf10466edb3aaeeb4b.png

多次输出编译后的a.out程序,同样可以看到执行的顺序也是不定的,且进程的ID号也不相同。

分析:

我认为

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值