0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

fork()函數(shù)詳解

嵌入式加油站 ? 來源:嵌入式加油站 ? 2023-08-15 09:41 ? 次閱讀

1.fork()簡介

函數(shù)原型:

pid_t fork(void);//pid_t為int類型,進行了重載

pid_t getpid();// 獲取當前進程的 pid 值。

pid_t getppid(); //獲取當前進程的父進程 pid 值。

用于創(chuàng)建一個進程,所創(chuàng)建的進程復制父進程的代碼段/數(shù)據(jù)段/BSS段/堆/棧等所有用戶空間信息;在內(nèi)核中操作系統(tǒng)重新為其申請了一個PCB,并使用父進程的PCB進行初始化;

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

如圖所示 :我們將A 進程, 也就是調(diào)用 fork 的進程稱之為父進程, 而新的進程(B 進程)稱之為子進程。

關(guān)于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調(diào)用的一個奇妙之處就是它僅僅被調(diào)用一次,卻能夠返回兩次,它可能有三種不同的返回值:

在父進程中,fork返回新創(chuàng)建子進程的進程ID;

在子進程中,fork返回0;

如果出現(xiàn)錯誤,fork返回一個負值;

因此我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。(注:fork 調(diào)用生成的新進程與其父進程誰先執(zhí)行不一定,哪個進程先執(zhí)行要看系統(tǒng)的進程調(diào)度策略)

舉個例子來解釋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

可以看到產(chǎn)生兩個pid(進程)





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • pcb
    pcb
    +關(guān)注

    關(guān)注

    4319

    文章

    23099

    瀏覽量

    397889
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    593

    瀏覽量

    27397
  • PID控制
    +關(guān)注

    關(guān)注

    10

    文章

    460

    瀏覽量

    40095
  • Linux驅(qū)動
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    9965
  • Fork
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3302

原文標題:【Linux應用開發(fā)】fork()函數(shù)詳解

文章出處:【微信號:嵌入式加油站,微信公眾號:嵌入式加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux下多進程編程之fork()函數(shù)語法

    fork()函數(shù)語法 表1列出了fork()函數(shù)的語法要點。表1 fork()函數(shù)語法要點所需頭
    發(fā)表于 08-19 09:28

    Linux進程之fork()函數(shù)詳解及經(jīng)典筆試題

    也是所有進程的發(fā)起者和控制者。內(nèi)核啟動之后,便開始調(diào)用init進程來進行系統(tǒng)各項配置,該進程對于Linux系統(tǒng)正常工作是十分重要的。一個進程(父進程)可以通過調(diào)用fork()函數(shù)創(chuàng)建一個新的進程,這個
    發(fā)表于 11-13 15:31

    Linux中fork()函數(shù)詳解

    一個進程,包括代碼、數(shù)據(jù)和分配給進程的資源。fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個進程也可以做不同
    發(fā)表于 11-12 13:37

    linux內(nèi)核do_fork函數(shù)創(chuàng)建新進程

    前面已經(jīng)談了內(nèi)核加載與系統(tǒng)引導過程,下面我們來看看內(nèi)核的 do_fork() 函數(shù)是如何創(chuàng)建一個新的進程的。
    發(fā)表于 08-06 08:40

    Fork/Join的框架機制詳解

      一、Fork/Join框架  Java提供Fork/Join框架用于并行執(zhí)行任務,核心的思想就是將一個大任務切分成多個小任務,然后匯總每個小任務的執(zhí)行結(jié)果得到這個大任務的最終結(jié)果?! ∵@種機制
    發(fā)表于 01-05 17:51

    最常見的fork用法是什么

    接口語法用來創(chuàng)造一個子進程在子進程中,成功的fork調(diào)用會返回 0。在父進程中fork返回子進程的 pid。如果出現(xiàn)錯誤,fork返回一個負值成功調(diào)用fork會創(chuàng)建一個新的進程,它幾乎
    發(fā)表于 12-15 07:38

    PICC庫函數(shù)詳解

    PICC庫函數(shù)詳解
    發(fā)表于 04-18 20:13 ?132次下載

    Android開發(fā)手冊—API函數(shù)詳解

    Android開發(fā)手冊—API函數(shù)詳解
    發(fā)表于 10-17 09:01 ?13次下載
    Android開發(fā)手冊—API<b class='flag-5'>函數(shù)</b><b class='flag-5'>詳解</b>

    基于Android開發(fā)手冊—API函數(shù)詳解

    基于Android開發(fā)手冊—API函數(shù)詳解
    發(fā)表于 10-24 09:06 ?18次下載
    基于Android開發(fā)手冊—API<b class='flag-5'>函數(shù)</b><b class='flag-5'>詳解</b>

    linux中fork()函數(shù)詳解

    一個進程調(diào)用fork()函數(shù)后,系統(tǒng)先給新的進程分配資源,例如存儲數(shù)據(jù)和代碼的空間。然后把原來的進程的所有值都復制到新的新進程中,只有少數(shù)值與原來的進程的值不同。相當于克隆了一個自己。
    發(fā)表于 04-28 17:34 ?1707次閱讀

    Linux中fork()函數(shù)詳解

    一個進程,包括代碼、數(shù)據(jù)和分配給進程的資源。fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個進程也可以做不同的事。
    發(fā)表于 05-08 14:08 ?1588次閱讀

    fork函數(shù)的作用_fork函數(shù)創(chuàng)建進程

     在Linux中fork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進程中創(chuàng)建一個子進程,而原進程稱為父進程。
    發(fā)表于 12-01 13:41 ?7910次閱讀
    <b class='flag-5'>fork</b><b class='flag-5'>函數(shù)</b>的作用_<b class='flag-5'>fork</b><b class='flag-5'>函數(shù)</b>創(chuàng)建進程

    Linux內(nèi)核GPIO操作函數(shù)詳解分析

    本文檔的主要內(nèi)容詳細介紹的是Linux內(nèi)核GPIO操作函數(shù)詳解分析免費下載。
    發(fā)表于 01-22 16:58 ?28次下載

    Linux中可怕的fork炸彈介紹

    Linux中的Fork炸彈(Fork Bomb)是一種拒絕服務攻擊的形式,它利用了操作系統(tǒng)中的“fork()”系統(tǒng)調(diào)用。
    的頭像 發(fā)表于 05-22 10:46 ?3024次閱讀
    Linux中可怕的<b class='flag-5'>fork</b>炸彈介紹

    STM32庫函數(shù)SystemInit()詳解

    STM32庫函數(shù)SystemInit()詳解
    的頭像 發(fā)表于 09-18 15:45 ?4054次閱讀
    STM32庫<b class='flag-5'>函數(shù)</b>SystemInit()<b class='flag-5'>詳解</b>