进程标识符与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\n", getpid(), glob, x);
    return 0;
}

运行结果:

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

fork的两种常见用法:

  • 父进程复制自己,使父、子进程执行不同的代码段。例如网络服务进程,父进程等待客户端的请求,收到请求后fork出一个子进程,让子进程处理请求,父进程继续等待其它客户端的请求。
  • 一个程序要执行另一个不同的程序。例如shell执行一条命令,子进程从fork返回后立即调用exec执行自己的代码。

参考:

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

进程标识符与fork函数,布布扣,bubuko.com

时间: 2024-10-13 17:29:31

进程标识符与fork函数的相关文章

【Linux编程】进程标识符与fork函数

ID为0的进程一般是调度进程.常被称为交换进程(swapper),是内核中的系统进程. ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用. 一个现有进程能够调用fork函数创建一个新进程(子进程).fork函数被调用一次.返回两次. 子进程返回值为0.父进程返回值为子进程的进程ID. 当fork出一个子进程后,子进程便拥有独立的数据段.堆.栈的副本,但父.子进程共享正文段(关于程序分布见文章"C程序的存储空间布局").但如今非常多实现并不全然复制数据段.堆.栈

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

lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进程之间的关系.父子进程的数据共享问题等.fork 是否可以无限制的调用?如果不行的话,最大限制是多少?另外,我们还将学习一个 fork 的变体 vfork. 1 fork 创建的新进程与调用进程之间的关系 UNIX 操作系统中的所有进程之间的关系呈现一个树形结构.除了进程 ID

进程控制(三)---fork函数

Linux系统提供了 fork 函数用来创建子进程.fork 函数和普通的函数相比,其特殊的地方在于 fork 函数被调用一次,但是会返回两次.一次返回时在父进程中,另一次返回值是在子进程中. ==================================================== 函数原型: 返回值: 调用失败时返回 -1 给父进程,而且子进程也不会被创建. 调用成功时,在父进程中返回 子进程的进程 ID,在子进程中返回 0 ==========================

4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()

 1fork()函数 子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同.fork调用一次返回两次,有以下特点: A:父进程中返回子进程ID B:子进程中返回0 C:读时共享,写时复制 2fork()依赖的头文件 #include <unistd.h> 3fork()函数说明: pid_tfork(void); 通过该函数创建一个子进程 4案例说明: 总结: A因为读时共享和写时复制,子进程会复制父进程的代码,但是从fork下开始执行.但是,当在fork前定义父子进程都用到

fork函数的基本介绍和应用

从fork()函数的角度来看,一个进程大致包括以下三点: 代码 数据 分配给进程的资源 fork()函数通过系统调用,创建一个与原来进程几乎完全相同的进程,接入点从调用fork()函数处开始.也就是两个进程在之后的步骤里可以做完全相同的事,但如果初始参数或者传入的变量不同,或者是判断条件不同,两个进程也可以做不太一样的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于孪生兄

Linux系统编程_8_进程控制之fork_wait_waitpid函数

fork函数: #include <unistd.h> pid_t fork(void); fork用来创建一个子进程: 特点: fork调用后会返回两次,子进程返回0,父进程返回子进程的进程ID:fork返回后,子进程和父进程都从fork函数的下一条语句開始运行: 注意: fork之后,操作系统会复制一个与父进程全然同样的子进程,虽说是父子关系.可是在操作系统看来,他们更像兄弟关系,这两个进程共享代码空间,可是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝.指令指针也全然同样

&lt;UNIX环境高级编程&gt;文件共享及fork函数

UNIX系统支持在不同进程间共享打开文件.内核使用3种数据结构表示打开文件,它们之间的关系决定了文件共享方面一个进程对另一个进程可能产生的影响. 内核维持了3个表,即进程表,文件表和v节点表.具体如下: 1>每个进程在进程表中都有一个纪录项,记录项中包含一张打开文件描述符表,每个描述符占用一项.与每个文件描述符相关联的是: a. 文件描述符标志(close_on_exec): b. 指向一个文件表项的指针. 2>内核为所有打开文件维持一张文件表.每个文件表项包含: a. 文件状态标志(读.写.

Linux进程之Fork函数

Fork()函数 1.所需头文件: #include <unistd.h> #include<sys/types.h> 2.函数定义 pid_t fork( void ); pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID: 否则,出错返回-1 3.函数说明: 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(chil

小何讲进程: Linux进程控制编程 (fork、vfork)

所谓进程控制,就是系统使用一些具有特定功能的程序段来创建进程.撤消进程以及完成进程在各种状态之间的转换, 从而达到多进程高效率并发执行和协调资源共享的目的.进程控制是进程管理和处理机管理的一个重要任务. 1. fork()创建进程 在Linux系统中,除了系统启动之后的第一个进程(根进程)由系统来创建外, 其余所有进程都必须由已存在的进程来创建新创建的进程叫子进程,而创建子进程的进程叫父进程, 具有相同父进程的进程叫兄弟进程. 在Linux中创建一个新进程的方法是使用fork()函数. fork