zoukankan      html  css  js  c++  java
  • 【Linux编程】进程标识符与fork函数

    ID为0的进程一般是调度进程。常被称为交换进程(swapper),是内核中的系统进程。

    ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用。

    一个现有进程能够调用fork函数创建一个新进程(子进程)。fork函数被调用一次。返回两次

    子进程返回值为0。父进程返回值为子进程的进程ID。


    当fork出一个子进程后,子进程便拥有独立的数据段、堆、栈的副本,但父、子进程共享正文段(关于程序分布见文章“C程序的存储空间布局”)。但如今非常多实现并不全然复制数据段、堆、栈,開始时父、子进程共享全部段,仅仅有当一个进程试图改动某个区域时才对那个区域进行复制。

    这就是所谓的写时复制(COW)。


    測试代码:
    #include <stdio.h>
    #include <unistd.h>
     
    int glob = 123;
     
    int main(void)
    {
        int x = 456;
        pid_t pid;
     
        if ((pid = fork()) < 0)
            return -1;
        else if (pid == 0)
        {
            // 子进程
            glob++;
            x++;
        }
        else
            sleep(2);     // 父进程休眠两秒钟
     
        printf("pid = %d, glob = %d, x = %d
    ", getpid(), glob, x);
        return 0;
    }
    

    执行结果:


    从执行结果能够看出。数据段和栈已经相互独立了。由于glob存放在初始化数据段中,x存放在栈中,子进程对它们的改变并没有影响到父进程。

    fork的两种常见使用方法:
    • 父进程复制自己,使父、子进程运行不同的代码段。比如网络服务进程。父进程等待client的请求,收到请求后fork出一个子进程。让子进程处理请求,父进程继续等待其他client的请求。

    • 一个程序要运行还有一个不同的程序。

      比如shell运行一条命令。子进程从fork返回后马上调用exec运行自己的代码。

    參考:
    《unix环境高级编程》 P171-P176.

  • 相关阅读:
    BZOJ4416 SHOI2013阶乘字符串(状压dp)
    雅礼集训 Day2 T3 联盟 解题报告
    雅礼集训 Day1 T2 折射
    雅礼集训 Day1 T1 养花
    P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
    洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
    动态MST
    洛谷 P2606 [ZJOI2010]排列计数 解题报告
    牛客 2018NOIP 模你赛2 T2 分糖果 解题报告
    洛谷 P3396 哈希冲突 解题报告
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5079528.html
Copyright © 2011-2022 走看看