[嵌入式linux] fork() 并发 进程

[复制链接]
3662|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 | 显示全部楼层

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

有时间并不能看到竞争正常现象…
 楼主| 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来控制进程执行的语句了,但是,因为没有对父子进程进行同步,所以还是应该会发生不确定的因素,虽然不知道将代码和变量分开来看是否正确,但是,还是能在一定程度上对本人起到理解进程的作用。

 
未来是梦 发表于 2009-5-27 01:39 | 显示全部楼层

re

刚fork时,父子进程用户态空间都是一样的拉,变量当然也是同一个;但如果一个进程改写一个变量,那么就发生进程空间的拷贝;真正分裂;
所谓的 copy on write ; 
sinanjj 发表于 2009-5-27 11:46 | 显示全部楼层

这个结果很正常。。。

进程间的调度肯定是可重复的
380121850 发表于 2009-5-27 22:03 | 显示全部楼层

难呢~~

是啊~
 楼主| op27 发表于 2009-5-28 21:52 | 显示全部楼层

谢谢6楼指教

这就是传说中的copy-on-write。
呵呵,其实也有看过内核方面的书,但是吧,收效不大,看我问的问题就知道了,哈哈。
谢谢六楼的指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

57

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部