现在的位置: 首页 -> LAMP学习 -> linux学习 -> C语言fork函数创建进程详解

C语言fork函数创建进程详解

2020-05-02 16:40评论数 4 ⁄ 被浏览 14230 views+

在linux下,C语言创建进程用fork函数,接下来我们通过代码来一步步了解fork函数的各个知识点。


1、依赖的头文件

#include <unistd.h>


2、fork的原理和概念

fork子进程就是从父进程拷贝一个新的进程出来,子进程和父进程的进程ID不同,但用户数据一样。

在C语言中,创建一个子进程代码如下:

pid_t pid; //pid_t 从底层来看,实际上是int类型。
pid = fork();


3、父进程和子进程

执行fork函数后有2种返回值:对于父进程,返回的是子进程的PID(即返回一个大于0的数字);对于子进程,则返回0,所以我们可以通过pid这个返回值来判断当前进程是父进程还是子进程。如下代码所示:


if(pid > 0)
{
    printf("im parent process, pid: %d\n", getpid());
}
else if(pid == 0)
{
    printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());
}
else
{
    printf("fork failed\n");
}


温馨提示:

getpid() -获取当前进程的pid

getppid() -获取当前进程的父进程的pid


4、完整例子&子进程代码执行位置

了解这些之后,我们来看一个创建子进程的完整代码示例:


#include    <stdio.h>
#include    <unistd.h>

int main(int argc, char *argv[])
{
    printf("========== before fork =============\n");

    pid_t pid;
    pid = fork();

    printf("========== after fork =============\n");

    if(pid > 0)
    {
        printf("im parent process, pid: %d\n", getpid());
    }
    else if(pid == 0)
    {
        printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());
    }
    else
    {
        printf("fork failed\n");
    }

    printf("========== process end =============\n");
    sleep(1);
    return 0;
}


运行结果如下图:


image.png


从上图可以看出,程序只输出了1个“before fork”,但输出了2个“after fork”,所以我们可以得出:子进程的代码执行是从fork()位置之后开始的。事实也确实是如此。


5、循环创建子进程

有时候,我们需要创建多个子进程,可以通过for循环来实现,代码如下:


#include    <stdio.h>
#include    <unistd.h>

int main(int argc, char *argv[])
{
    int i = 0;
    pid_t pid;
    for(i = 0; i < 3; i++)
    {
        pid = fork();
    }

    if (pid == 0)
    {
        printf("im child process, pid: %d, parent pid: %d\n", getpid(), getppid());
    }
    else
    {
        printf("im parent process, pid: %d\n", getpid());
    }

    sleep(1);
    return 0;
}


运行结果如下图:


image.png


咦,我们不是循环创建3个子进程吗,怎么输出了这么多次parent process和child process呢?

这是因为子进程也创建了子进程,大家可以观察一下图中的pid。数了一下,共输出了8次,刚好是2的3次方。


我画了一个fork步骤图,便于大家更好的理解,如下:


image.png


如上图所示,子进程在第2轮、3轮,也会相当于父进程一样继续fork子进程,所以for循环3次后,刚好得到共8个进程。


那如果我们就想通过循环3次,得到3个子进程,要怎么办呢?


思路:不让子进程fork出新的子进程。


代码片段如下:

for(i = 0; i < 3; i++)
{
    pid = fork();
    if (pid == 0)
    {
        break;
    }
}


运行结果:


image.png


至此,fork函数创建子进程介绍完毕。

 

文章出自:https://www.daixiaorui.com/read/286.html 本站所有文章,除注明出处外皆为原创,转载请注明本文地址,版权所有。

目前有 4 条评论  @我要评论

  1. 4楼八门神器 : 2023-03-03 11:43:54 评论说: @回复

    gg修改器https://www.guiyangtax.com/ 葫芦侠http://www.booj.net/ 八门神器http://www.tusovok.net/

  2. 3楼gfdhg : 2022-06-28 14:36:09 评论说: @回复

    王者荣耀免费刷10万点卷不封号http://www.sxjzxny.com/

  3. 2楼快乐编程,快乐生活 : 2022-06-21 14:18:18 评论说: @回复

  4. 1楼快乐编程,快乐生活 : 2022-06-21 14:18:17 评论说: @回复

    一开始就给以全然的性解放,不会有结果。你不难明白,一旦情欲的满足太轻易,它便不会有什么价值而言 https://happycodinghappylife.com

您的每一个评论都是对我的一份支持

 博客二维码

昵称 *

邮箱 *