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\n", getpid(), glob, x);
return 0;
}
执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


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

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

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

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

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

【Linux编程】进程标识符与fork函数的更多相关文章

  1. 进程控制之fork函数

    一个现有进程可以调用fork函数创建一个新进程. #include <unistd.h> pid_t fork( void ); 返回值:子进程中返回0,父进程中返回子进程ID,出错返回- ...

  2. [Chapter 3 Process]Practice 3.1 相关知识:进程创建、fork函数

    3.1 Using the program shown in the Figure3.30, explain what the output will be at LINE A 答案:LINE A 处 ...

  3. linux多进/线程编程(2)—— fork函数和进程间“共享”数据

    参考: 1.博客1:https://www.pianshen.com/article/4305691855/ fork:在原进程的基础上"分叉"出一个子进程,即创建一个子进程. N ...

  4. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...

  5. linux源码阅读笔记 fork函数

    在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork ...

  6. 进程管理之fork函数

    fork函数的定义 #include <unistd.h> #include <sys/types.h> pid_t fork(void); fork函数在父进程中返回子进程的 ...

  7. Linux -- 进程管理之 fork() 函数

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. Test1 f ...

  8. Linux0.11 创建进程的过程分析--fork函数的使用

    /* * linux/kernel/fork.c * * (C) 1991 Linus Torvalds */ /* 注意:signal.c和fork.c文件的编译选项内不能有vc变量优化选项/Og, ...

  9. Linux编程---进程通信

    Linux的通信方式主要有分类有以下几种: -匿名管道和FIFO有名管道 -消息队列,信号量和共享存储 -套接字 对于套接字的进程通信,我就留在套接字的文章中再写了. 一.管道 管道是最古老的进程通信 ...

随机推荐

  1. Percona XtraDB Cluster(PXC) -集群环境安装

    Percona XtraDB Cluster(PXC)   ---服务安装篇   1.测试环境搭建: Ip 角色 OS PXC-version 172.16.40.201 Node1 Redhat/C ...

  2. coding.net--多人合作开发git的使用

    // 从conding拉下新项目 mkdir test cd test git clone https // 安装cocoapods gem sources --remove https://ruby ...

  3. IEEEXtreme 10.0 - Mysterious Maze

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Mysterious Maze 题目来源 第10届IEEE极限编程大赛 https://www.hacker ...

  4. c++ 容器学习 理论

    [转载]http://blog.csdn.net/acosoft/article/details/4395468 在面向对象的语言中,大多引入了容器的概念.那么 什么 是 容器?实质上就是一组相同类型 ...

  5. [转]跟我一起写Makefile系列

    原作者:陈皓专栏 [空谷幽兰,心如皓月] 跟我一起写 Makefile(一) 跟我一起写 Makefile(二) 跟我一起写 Makefile(三) 跟我一起写 Makefile(四) 跟我一起写 M ...

  6. LoadRunner:VuGen开发脚本步骤(二)

    一.介绍 Loadrunner的场景能够描述在测试活动中发生的各种事件.一个场景包括一个运行虚拟用 户活动的Load Generator 机器列表,一个测试脚本的列表以及大量的虚拟用户和虚拟用户组 二 ...

  7. 【C#】线程问题

    多线程编程对很多程序员来说并不容易,在启动访问相同数据的多个线程时,会间歇性地遇到难以发现的问题.如果使用任务.并行LINQ或Parallel类,也会遇到这些问题.为了避免这一系列问题,开发程序中必须 ...

  8. 自定义寄存器出现error C142: 'SFR': invalid base address

    今天打算自定义一个.H文件来写写代码.自定义寄存器的时候发现出现这样的问题7816.H(5): error C142: 'SFR': invalid base address. 下面是我自定义的寄存器 ...

  9. 首次使用ideal构建maven项目web

    如附件 链接:https://pan.baidu.com/s/1oH-9VfIKnLPjVt-tOH7fZw 提取码:7s5t

  10. 【JAVAWEB学习笔记】30_WEB总结_思维导图

    可以在浏览器放大来查看细节,或者另存为图片到本地电脑查看.