博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fork()使用详解
阅读量:4081 次
发布时间:2019-05-25

本文共 1642 字,大约阅读时间需要 5 分钟。

fork()使用详解

 

 摘自:https://blog.csdn.net/u014082714/article/details/45031771

一、fork入门知识

进程的定义:

进程是一个执行中的程序的实例,是系统进行资源分配和调度的一个独立单位。

PCB是进程存在的唯一标识。PCB应常驻内存,不管在linux还是windows中都有专门区域存储每个进程的PCB。

进程的创建:

子进程可以继承父进程所拥有的所有资源,当子进程被撤销时,应将其从父进程那里获得的所有资源归还给父进程,在撤销父进时,也必须同时撤销其所有子进程。

 

进程的同步:

进程同步的主要任务是对多个相关进程早执行次序上进行协调,以使并发执行的诸进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。

     一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

     我们来看一个例子:

 

点击(此处)折叠或打开

    #include <stdio.h>

    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
     
    /*
    * @brief main For the understanding of the fork()
    *
    * @param argc
    * @param argv[]
    *
    * @return 在父进程中返回子进程的进程号;在子进程中返回0。
    */
    int main(int argc, char *argv[])
    {
        pid_t pid;
        int cnt = 0;
     
        pid = fork();
     
        if (pid == -1) {
            perror("fork error");
            exit(1);
        } else if (pid == 0) {
            printf("The returned value is %d\nIn child process!!\nMy PID is %d\n",
            pid, getpid());
            cnt++;
        } else {
            printf("The returned value is %d\nIn father process!!\nMy PID is %d\n",
            pid, getpid());
            cnt++;
        }
        printf("cnt = %d\n", cnt);
     
        return 0;
    }

     运行结果是:

     The returned value is 20473
     In father process!!
     My PID is 20472
     cnt = 1
     The returned value is 0
     In child process!!
     My PID is 20473
     cnt = 1

    在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(pid == -1)……

    为什么两个进程的pid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
    1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回-1;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

 

你可能感兴趣的文章
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>
用结构体指针前必须要用malloc,不然会出现段错误
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
我觉得专注于去学东西就好了,与世无争。
查看>>
原来k8s docker是用go语言写的,和现在所讲的go是一个东西!
查看>>
STM32CubeMX 真的不要太好用
查看>>
STM32CubeMX介绍、下载与安装
查看>>
电机和桨叶要搭配选择
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
F330装GPS的位置
查看>>
我想先用三个或者五个激光测距做无人机的室内定位和避障
查看>>
pixhawk也可以用Airsim仿真
查看>>
《无人机电机与电调技术》可以看看
查看>>
我发现七月在线的GAAS课程基本都讲到了
查看>>
电机堵转
查看>>
一个真正好的无人机应该是需要自己慢慢去调参的,别人的默认参数是可以飞但是可能达不到perfect的效果。
查看>>