• fork 返回值


    fork简介: fork英文原意是“分岔,分支”的意思,而在操作系统中,乃是著名的Unix(或类Unix,如Linux,Minix)中用于创建子进程的系统调用。

    【NOTE1】

    fork () 的作用是什么?换句话说,你用 fork () 的目的是什么?

    ――  是为了产生一个新的进程,地球人都知道 :)

    产生一个什么样的进程? ――  和你本来调用 fork () 的那个进程基本一样的进程,其实就是你原来进程的副本;

    真的完全一样吗? ――  当然不能完全一样,你要两个除了 pid 之外其它一模一样的进程干什么,就算memory再多也不用这么摆谱吧?

    哪里不一样? ――  当然最重要的是 fork () 之后执行的代码不一样,you know, i know :)

    怎么实现呢? ――  如果是 Windows,它会让你在 fork () 里面提供一大堆东西,指明这个那个什么的…… 我用的是 unix 啊 ――  所以很简单,unix 会让两个进程(不错,原来是一个,unix 替你复制了一个,现在有两个) 在 fork () 之后产生不同:返回值不同。其中一个进程(使用新的 pid)里面的 fork () 返回零, 这个进程就是“子进程”;而另一个进程(使用原来的 pid)中的 fork () 返回前面那个子进程的 pid,他自己被称为“父进程”

    然后呢? ――写代码的人又不笨,当然就根据返回值是否非零来判断了,现在我是在子进程里面呢,还是在 父进程里面?在子进程里面就执行子进程该执行的代码,在父进程里面就执行父进程的代码……

    有铁杆 windows fans 借此说明,windows 好啊,子进程用子进程的代码,父进程用父进程的, 你 unix 笨了吧,子进程包含父进程、子进程的代码,父进程包含父进程子进程的代码,岂不是多占用内存了吗? ――据我所知,unix 代码段都是可重入代码,也就是说,进程复制,并不复制代码段,若干个进程 共享同一代码段,增加的只是全局共享数据和对文件描述符的引用等,另外就是堆栈。你一个代码 长达 10M 的进程,fork () 出三四个子进程,只是增加一点内存占用(如果你没有使用很多全局变量 的话),而不是占用 40M 以上的内存。

    【NOTE2】

    程序从   fork   开始分支(称分支不准确),   一路是主进程   pid   >   0   (pid   是子进程ID)   一路是子进程   pid   ==   0   自此分成两个任务 其实fork的时候已经两个分支了,数据段被复制了一份,因此pid有两份 执行pid=fork()时,返回值赋给pid在两个进程中运行, fork会返回给父进程的那个>0的值,告诉调用者新建进程的pid 子进程的fork返回值是0 更不用说if...else的比较也是在两个进程中都能做的了

    【NOTE3】

    fork的精辟剖析 程序如下: 

    #include <unistd.h>; 
    #include <sys/types.h>; 
    main () { 
        pid_t pid; 
        pid=fork(); 
        
        if (pid < 0) printf("error in fork!"); 
        else if (pid == 0) printf("i am the child process, my process id is %dn",getpid()); 
        else printf("i am the parent process, my process id is %dn",getpid()); 
    } 
    
    /*
    结果是 
    [root@localhost c]# ./a.out 
    i am the child process, my process id is 4286 
    i am the parent process, my process id is 4285
    */

    参考连接:https://blog.csdn.net/guichen83/article/details/4160697

  • 相关阅读:
    代码review之 isInfoEnable()
    sdk、jdk、jre、jvm、jdt、cdt分别都是什么东西
    思考总结: 决胜21点 开篇 概率问题
    Java多线程开发系列之四:玩转多线程(线程的控制2)
    Java多线程开发系列之四:玩转多线程(线程的控制1)
    Java多线程开发系列之三:线程这一辈子(线程的生命周期)
    Java多线程开发系列之二:如何创建多线程
    [系列] Gin框架
    [系列] Gin框架
    [系列] Gin 框架
  • 原文地址:https://www.cnblogs.com/neozheng/p/13587427.html
Copyright © 2020-2023  润新知