• linux中fork()函数详解


     1、fork入门

    计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。

    fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了

    该应用程序的两个副本。

      需要注意的是:(1)当调用fork()函数时,在该位置进程一分为二,一个是父进程,一个是子进程。(2)若调用成功返回的是两个值,父进程返回的值为子进程标志,子进程返回的值为0,不成功返回为-1。

      为什么成功调用会返回两个值?由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

       每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。

      子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。下面看一个简单的例子:

     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 int main()
     6 {
     7     pid_t pid = fork();
     8     if(pid < 0)
     9         printf("error");
    10     else if(pid == 0)
    11         printf("this is child
    ");
    12     else
    13         printf("this is parent
    ");
    14     return 0;
    15 }
    View Code

      输出:this is parent

                  this is child

      至于父进程和子进程哪个先执行,这和操作系统和调度算法有关,其实这个问题在实际应用中并不重要。

     2、fork进阶

      看一下一个例子。

     1 #include <unistd.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 int main()
     6 {
     7     int i = 0;
     8     for(i = 0; i < 3; i++)
     9     {
    10         fork();
    11         printf("hello world
    ");
    12     }
    13     return 0;
    14 }
    View Code

       运行的时候一共输出14个hello world。

       当i = 0的时候,一共2个进程,输出2个hello world, 当i=1时,2个进程变成4个,这时输出4个hello world,当i=2时,4个进程变成8个,这时输出8个hello world,一共输出2+4+8=14个hello world。当循环n次时,就输出2(1 + 2 + 2n-1)个。

     

  • 相关阅读:
    Daily Scrum 12.9
    成员总结
    反省与深思
    M1事后分析报告--We have power to change the origin state
    PowerTeam--Alpha阶段个人贡献分及转会人员
    Pipeline Alpha版本项目展示
    js 字符串操作函数
    js与jq对数组的操作
    js 与 jq 的节点添加删除实例
    js,jq,css选择器
  • 原文地址:https://www.cnblogs.com/Hxinguan/p/5006628.html
Copyright © 2020-2023  润新知