打印
[嵌入式linux]

fork() 并发 进程

[复制链接]
2692|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
op27|  楼主 | 2009-5-9 12:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h> 
main() 
{int p1,p2; 
  while((p1=fork())==-1); 
  if(p1==0) putchar('b'); 
  else 
    { 
      while((p2=fork())==-1); 
      if (p2==0) putchar('c'); 
      else putchar('a'); 
    } 

以上存档在tst.c文件中 
编译该文件 cc tst.c 
生成a.out可执行文件 
多次运行./a.out 
本应该因为并发执行进程的原因出现不同的输出结果:bca,bac,abc..... 
但是,经过实践,只有一种结果:bca。 
想请问,能不能全面分析一下这个简单的程序。

相关帖子

沙发
未来是梦| | 2009-5-9 21:54 | 只看该作者

re

这也不能说明什么,明白fork以后父子谁先调度是不确定就行了;
你也许第100次,10000次以后看到输出结果:bca,bac,abc..... 

使用特权

评论回复
板凳
sinanjj| | 2009-5-10 10:40 | 只看该作者

格式不对

参考下内核文档里的C语言格式先

使用特权

评论回复
地板
一朝成名| | 2009-5-10 14:54 | 只看该作者

这跟处理器的调度有关系…

有时间并不能看到竞争正常现象…

使用特权

评论回复
5
op27|  楼主 | 2009-5-26 21:31 | 只看该作者

自己的理解

子进程共享父进程的代码,并且复制父进程变量,所以,本人感觉关键是代码和变量要分开来看待,因为就像上面所说的一样,代码部分是共享的,但是变量是各自拥有的。完全是个人见解,不知道对与不对。
再者,回到这个程序:
   #include <stdio.h> 
main() 
{int p1,p2; 
  while((p1=fork())==-1); //创建子进程,同时子进程拥有
                           //独立于父进程的 变量p1,p2。
 if(p1==0) putchar('b'); //子进程中的p1返回0,故子进程执行putchar语句
  else                   //因为子进程中的变量p1==0,故不执行else语句 
    { 
      while((p2=fork())==-1); 
      if (p2==0) putchar('c'); 
      else putchar('a'); 
    } 

上面是以子进程为主线来分析的,下面再以父进程为主线来分析一遍。
#include <stdio.h> 
main() 
{int p1,p2; 
  while((p1=fork())==-1); //fork执行后,父进程返回值给p1,
                        //值为子进程的id号,且不等于0.
  if(p1==0) putchar('b'); //父进程中p1不为0故不满足if的条件。
  else                    //因为不满足if的条件,所以执行else语句。
    { 
      while((p2=fork())==-1); 
      if (p2==0) putchar('c'); 
      else putchar('a'); 
    } 

 这样一来就可以解释用if else来控制进程执行的语句了,但是,因为没有对父子进程进行同步,所以还是应该会发生不确定的因素,虽然不知道将代码和变量分开来看是否正确,但是,还是能在一定程度上对本人起到理解进程的作用。

 

使用特权

评论回复
6
未来是梦| | 2009-5-27 01:39 | 只看该作者

re

刚fork时,父子进程用户态空间都是一样的拉,变量当然也是同一个;但如果一个进程改写一个变量,那么就发生进程空间的拷贝;真正分裂;
所谓的 copy on write ; 

使用特权

评论回复
7
sinanjj| | 2009-5-27 11:46 | 只看该作者

这个结果很正常。。。

进程间的调度肯定是可重复的

使用特权

评论回复
8
380121850| | 2009-5-27 22:03 | 只看该作者

难呢~~

是啊~

使用特权

评论回复
9
op27|  楼主 | 2009-5-28 21:52 | 只看该作者

谢谢6楼指教

这就是传说中的copy-on-write。
呵呵,其实也有看过内核方面的书,但是吧,收效不大,看我问的问题就知道了,哈哈。
谢谢六楼的指教。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

57

帖子

0

粉丝