当前位置:   article > 正文

一文搞懂fork函数(创建子进程)_fork子进程

fork子进程
/**
  ****************************************************************************************
  * @file    09_fork1.c
  * @author  GuiStar-李什么恩
  * @version V1.1.0
  * @date    2023-4-15
  * @brief   对fork函数的理解:
  *           1.一次调用fork会产生两次返回值:
  *            解释:因为fork调用会创建一个新的进程,这个新的进程就是子进程,也就是说,在fork调用之后,
  *            会存在两个进程,一个子进程,一个父进程。所以会有两个返回值,子进程会返回一个,父进程也会
  *            返回一次。并且这两次返回值是不一样的,分别会返回一个0和大于0的整数,这个0是子进程的返回值,
  *            大于0的整数是父进程的返回值,所以我们可以通过不同的返回值来判断当前是父进程还是子进程,这
  *            个大于0的整数其实就是子进程的pid
  *           2.fork创建了一个与原来进程几乎相同的进程:
  *            其实子进程是父进程的一个副本,fork函数是以复制的方式创建子进程,子进程几乎完全复制了父进
  *            程,然后也从main函数的第一句开始执行,不同的是,fork()返回0,且不会创建新的子进程(否
  * 		   则就递归创建无限个进程了),譬如子进程会考被父进程的数据段,堆,栈,并且拷贝父进程打开的所
  * 		   有文件描述符,父进程与
  *            子进程并不共享这些存储空间,这是子进程对父进程相应部分存储空间的完全复制,执行fork之
  *            后,子进程和父进程各自在自己的进程空间中运行,每个进程均可以独立修改自己的堆栈空间中的变量
  *            而不会影响另一个进程
  * 
  * @note    另外,在介绍两个函数getpid和getppid,他们都是无参函数,会分别返回当前进程的pid和当前进程
  *          父进程的pid
  ****************************************************************************************
  */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

 int main(void)
 {
    int ret;
    int a=100;

    printf("I love IU!,my PID=%d\n",getpid());
    ret=fork();
    if(ret==-1)
    {
         perror("fork error");
         exit(1);
    }
    else if(ret==0)
    {
        printf("I an a child,PID=%d,PPID=%d\n",getpid(),getppid());
        printf("a=%d\n",a);
        a=10000;
        printf("a=%d\n",a);
    }
    else if(ret>0)
    {
        sleep(1);
        printf("I am a father,PID=%d\n",getpid());
        printf("a=%d\n",a);
    }
    printf("I love IU!,my PID=%d\n",getpid());
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

运行结果

参考文献:《正点原子LinuxC应用编程》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/883006
推荐阅读
  

闽ICP备14008679号