当前位置:  技术问答>linux和unix

一个关于fork进程的问题

    来源: 互联网  发布时间:2015-10-14

    本文导语:  很简单的一段代码: #include  int main(int argc , char **argv) {     int i;     int pid;     for ( i = 0 ; i  fork_test # Parent:9228 # Child:9229 ## fork print is : 0 # Parent:9228 # Child:9230 ## fork print is : 1 # Parent:922...

很简单的一段代码:
#include 

int main(int argc , char **argv)
{
    int i;
    int pid;

    for ( i = 0 ; i  fork_test
# Parent:9228 # Child:9229 ## fork print is : 0
# Parent:9228 # Child:9230 ## fork print is : 1
# Parent:9228 # Child:9231 ## fork print is : 2
[sybase]/export/home/sybase/lrj/bin> # Parent:9229 # Child:9232 ## fork print is
 : 1
# Parent:9230 # Child:9233 ## fork print is : 2
# Parent:9229 # Child:9234 ## fork print is : 2
# Parent:9232 # Child:9235 ## fork print is : 2
(不出现命令行提示符,光标停在此处)

并且每次运行该程序结果不一样。

本人很想知道的是:这个程序(主要是fork()调用)的运行机制到底是怎样的,才会出现上述的结果?

|
这个问题我分析了一下,确实挺有意思的。
子进程会完全克隆主进程,这每个人都很清楚。
这样每个子进程都会继续循环下去继续产生新的子进程,这也是对的,但为什么会产生楼主所示的情况呢,我认为可能是一下原因:
  首先第一个进程(父进程,楼主的是9228进程),在第一次循环它会产生一个子进程(9229)这时就出现了第一条打印信息。接着9229将继承9228的一切,包括资源(例如变量i的值),这时i=1,这是9228和9229会同时做一件事(继续循环创建子进程,i是从1开始的),他们分别创建了9230、9232这两个子进程,于是就出现了第二条和第四条打印信息(# Parent:9228 # Child:9230 ## fork print is : 1    # Parent:9229 # Child:9232 ## fork print is
 : 1)。接着会有4个进程做同样的事情,(这时i已经等于2了,是最后一次循环了),他们又分别创建了四个子进程(9231,9233,9324,9235)。接着整个程序就运行完了。至于命令行跑到中间,光标停在最后不动了,那都是标准输出缓冲的问题,跟这个程序没有一点关系。虽然每次结果不同,但是你们可以发现一些规律,就是9228创建了三个进程(因为循环了三次),9229创建了两个进程(循环了两次),9230和9232分别创建了一个进程。因为是并行的,所以顺序有时候会不一样。

|
子进程被创建之后把所有父进程的数据都作一份拷贝,并且继续向下执行,注意下面的打印,
父进程创建了子进程9232之后,9232又变成父进程产生子进程9235,直到i的值增加到3,fork才结束。
如果系统没有机会执行父进程的++i的操作,这个fork递归执行下去。
所以在创建子进程之后父进程一般会退出或者等待。

[sybase]/export/home/sybase/lrj/bin> # Parent:9229 # Child:9232 ## fork print is
 : 1
# Parent:9230 # Child:9233 ## fork print is : 2
# Parent:9229 # Child:9234 ## fork print is : 2
# Parent:9232 # Child:9235 ## fork print is : 2

|
fork后,会有两个进程运行。父进程和子进程都运行!
更仔细全面的请看《高级环境编程》

|
光标肯可能是因为主进程比子进程先退出.
在子进程里 printf("# Parent : %d # Child : %d ## fork print is : %dn" , getppid() ,
getpid() , i); 这个i的值是创建子进程时对父进程的拷贝.
子进程里的i和主进程里的i是两回事. 也就是说父进程中的i改变了,不会改变子进程中的i.

    
 
 

您可能感兴趣的文章:

  • 奇怪:程序一fork子进程时就停住了,似乎根本不能fork子进程啊?
  • 程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存
  • 主进程有两个线程,fork子进程后复制主进程两个线程的内存么?
  • 父进程发包,fork子进程收回传的包,sock_filter后,子进程收不到包
  • fork 一个字进程 将子进程的输出作为主进程的输入
  • fork出来的子进程能通知主进程自己的进度吗
  • 用fork产生一个进程,但是在子进程里无法监视父进程变量的变动。
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • 调用fork操作后,子进程有返回,父进程挂死,什么原因?
  • fork一个子进程后在打开一个文件,如何在子进程中使用这个打开的文件描述符号
  • 问。fork()出来的子进程如果遇到brokenPIPE的错误,会影响父进程的关闭吗?
  • fork() 父子进程执行顺序问题
  • 怎样编写一段程序,要求调用fork并在子进程中建立一个新的对话期。验证子进程变成了进程组长而且不再有控制终端。
  • 请问fork子进程后,怎么修改子进程的所属用户。
  • fork出来的进程不能完全继承父进程的属性吗?
  • 创建进程的系统调用clone()和fork()
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 关于fork创建进程的一个问题
  • 如何向由fork出来的进程家族发送信号?
  • fork()复制进程的问题2
  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • 一个fork的问题
  • 新手的问题关于fork?
  • fork()函数入门级问题:fork()与进程数
  • fork的问题
  • 请教一个关于fork的问题。
  • minGW编译带fork函数的问题?
  • 一个简单的fork问题(那个高手来帮忙呀)
  • fork与socket问题
  • 关于fork()的一个问题!?
  • 问个关于fork的小问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • unix中的fork2与fork有设么区别?
  • 如何理解fork函数返回2次啊?
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • 请教 linux的fork从什么版本开始支持COW?
  • c++ 和 fork
  • "fork(2)" 中这个2表示什么意思
  • fork函数的源代码在哪呢
  • 关于fork函数
  • fork函数的理解。。
  • linux的fork()函数
  • 创建一个子进程,什么时候该用clone()而不是fork()?
  • Linux fork() 函数
  • fork()的疑问


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3