fork()使用详解

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返回的值来判断当前进程是子进程还是父进程。
 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值