0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

fork()函数详解

嵌入式加油站 来源:嵌入式加油站 2023-08-15 09:41 次阅读

1.fork()简介

函数原型:

pid_t fork(void);//pid_t为int类型,进行了重载

pid_t getpid();// 获取当前进程的 pid 值。

pid_t getppid(); //获取当前进程的父进程 pid 值。

用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息;在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化;

bdc367f2-3aa9-11ee-9e74-dac502259ad0.png

如图所示 :我们将A 进程, 也就是调用 fork 的进程称之为父进程, 而新的进程(B 进程)称之为子进程。

关于fork 可以命令,查看详细说明及用法:

man 3 fork

NAME

fork, wait, waitpid - basic process management

SYNOPSIS
@load "fork"

pid = fork()

ret = waitpid(pid)

ret = wait();

DESCRIPTION
The fork extension adds three functions, as follows.

fork() Thisfunctioncreatesa new process. The return value is the zero in the child and the process-id number of the child in the parent, or -1 upon error. In the latter case, ERRNO indicates
the problem.In the child, PROCINFO["pid"] and PROCINFO["ppid"] are updated to reflect the correct values.

waitpid()
This function takes a numeric argument, which is the process-id to wait for. The return value is that of the waitpid(2) system call.

wait() This function waits for the first child to die.The return value is that of the wait(2) system call.

BUGS
There is no corresponding exec() function.

The interfaces could be enhanced to provide more facilities, including pulling out the various bits of the return status.

EXAMPLE
@load "fork"
...
if ((pid = fork()) == 0)
print "hello from the child"
else
print "hello from the parent"

SEE ALSO
GAWK: Effective AWK Programming, filefuncs(3am), fnmatch(3am), inplace(3am), ordchr(3am), readdir(3am), readfile(3am), revoutput(3am), rwarray(3am), time(3am).

fork(2), wait(2), waitpid(2).

AUTHOR
Arnold Robbins,arnold@skeeve.com.

COPYING PERMISSIONS
Copyright 2012, 2013, Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual page provided the copyright notice and this permission notice are preserved on all copies.


2.fork()特性

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

在父进程中,fork返回新创建子进程的进程ID;

在子进程中,fork返回0;

如果出现错误,fork返回一个负值;

因此我们可以通过fork返回的值来判断当前进程是子进程还是父进程。(注:fork 调用生成的新进程与其父进程谁先执行不一定,哪个进程先执行要看系统的进程调度策略)

举个例子来解释fpid的值为什么在父子进程中不同:“相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.

3, fork()例程

看到这里大家对fork()有个大致了解了,让我们来看个例题:

#include

#include

#include

int main(int argc, const char *argv[])

{

int num = 10;

pid_t pid = fork();

if(pid==0)

{

while (1)

{

num = 100;

printf("The father pid=%d The child pid=%d num=%d ", getppid(),getpid(), num);

sleep(3);

}

}

else

{

while (1)

{

printf("The father pid=%d num=%d ", getpid(), num);

sleep(5);

}

}

return 0;

}

保存为fork_test.c

gcc-o fork_test.a fork_test.c


运行:

./fork_test.a
The father pid=15131 num=10
The father pid=15131 The child pid=15132 num=100
The father pid=15131 The child pid=15132 num=100
The father pid=15131 num=10
The father pid=15131 The child pid=15132 num=100
The father pid=15131 The child pid=15132 num=100
The father pid=15131 num=10
The father pid=15131 The child pid=15132 num=100

可以看到产生两个pid(进程)





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • pcb
    pcb
    +关注

    关注

    4222

    文章

    22475

    浏览量

    385856
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26920
  • PID控制
    +关注

    关注

    10

    文章

    442

    浏览量

    39703
  • Linux驱动
    +关注

    关注

    0

    文章

    43

    浏览量

    9881
  • Fork
    +关注

    关注

    0

    文章

    14

    浏览量

    3235

原文标题:【Linux应用开发】fork()函数详解

文章出处:【微信号:嵌入式加油站,微信公众号:嵌入式加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux下多进程编程之fork()函数语法

    fork()函数语法 表1列出了fork()函数的语法要点。表1 fork()函数语法要点所需头
    发表于 08-19 09:28

    Linux进程之fork()函数详解及经典笔试题

    也是所有进程的发起者和控制者。内核启动之后,便开始调用init进程来进行系统各项配置,该进程对于Linux系统正常工作是十分重要的。一个进程(父进程)可以通过调用fork()函数创建一个新的进程,这个
    发表于 11-13 15:31

    Linux中fork()函数详解

    一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同
    发表于 11-12 13:37

    linux内核do_fork函数创建新进程

    前面已经谈了内核加载与系统引导过程,下面我们来看看内核的 do_fork() 函数是如何创建一个新的进程的。
    发表于 08-06 08:40

    Fork/Join的框架机制详解

      一、Fork/Join框架  Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。  这种机制
    发表于 01-05 17:51

    最常见的fork用法是什么

    接口语法用来创造一个子进程在子进程中,成功的fork调用会返回 0。在父进程中fork返回子进程的 pid。如果出现错误,fork返回一个负值成功调用fork会创建一个新的进程,它几乎
    发表于 12-15 07:38

    PICC库函数详解

    PICC库函数详解
    发表于 04-18 20:13 132次下载

    Android开发手册—API函数详解

    Android开发手册—API函数详解
    发表于 10-17 09:01 13次下载
    Android开发手册—API<b class='flag-5'>函数</b><b class='flag-5'>详解</b>

    基于Android开发手册—API函数详解

    基于Android开发手册—API函数详解
    发表于 10-24 09:06 18次下载
    基于Android开发手册—API<b class='flag-5'>函数</b><b class='flag-5'>详解</b>

    linux中fork()函数详解

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
    发表于 04-28 17:34 1585次阅读

    Linux中fork()函数详解

    一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
    发表于 05-08 14:08 1472次阅读

    fork函数的作用_fork函数创建进程

     在Linux中fork函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。
    发表于 12-01 13:41 7434次阅读
    <b class='flag-5'>fork</b><b class='flag-5'>函数</b>的作用_<b class='flag-5'>fork</b><b class='flag-5'>函数</b>创建进程

    SystemVerilog中的fork-join

    fork-join语句块中,每个语句都是并发进程。在这个语句块中,父进程一直被阻塞,直到所有由“fork-join”产生的子进程都执行完。
    的头像 发表于 12-09 11:58 1599次阅读

    Linux中可怕的fork炸弹介绍

    Linux中的Fork炸弹(Fork Bomb)是一种拒绝服务攻击的形式,它利用了操作系统中的“fork()”系统调用。
    的头像 发表于 05-22 10:46 2023次阅读
    Linux中可怕的<b class='flag-5'>fork</b>炸弹介绍

    STM32库函数SystemInit()详解

    STM32库函数SystemInit()详解
    的头像 发表于 09-18 15:45 1993次阅读
    STM32库<b class='flag-5'>函数</b>SystemInit()<b class='flag-5'>详解</b>