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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

fork()函數(shù)詳解

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

1.fork()簡介

函數(shù)原型:

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

pid_t getpid();// 獲取當(dāng)前進(jìn)程的 pid 值。

pid_t getppid(); //獲取當(dāng)前進(jìn)程的父進(jìn)程 pid 值。

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

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

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

關(guān)于fork 可以命令,查看詳細(xì)說明及用法:

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)用一次,卻能夠返回兩次,它可能有三種不同的返回值:

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

在子進(jìn)程中,fork返回0;

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

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

舉個例子來解釋fpid的值為什么在父子進(jìn)程中不同:“相當(dāng)于鏈表,進(jìn)程形成了鏈表,父進(jìn)程的fpid(p 意味point)指向子進(jìn)程的進(jìn)程id, 因?yàn)樽舆M(jìn)程沒有子進(jìn)程,所以其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


運(yùn)行:

./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(進(jìn)程)





審核編輯:劉清

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

    關(guān)注

    4295

    文章

    22776

    瀏覽量

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

    關(guān)注

    4

    文章

    587

    瀏覽量

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

    關(guān)注

    10

    文章

    449

    瀏覽量

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

    關(guān)注

    0

    文章

    43

    瀏覽量

    9922
  • Fork
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3257

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    Fork/Join的框架機(jī)制詳解

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

    最常見的fork用法是什么

    接口語法用來創(chuàng)造一個子進(jìn)程在子進(jìn)程中,成功的fork調(diào)用會返回 0。在父進(jìn)程中fork返回子進(jìn)程的 pid。如果出現(xiàn)錯誤,fork返回一個負(fù)值成功調(diào)用fork會創(chuàng)建一個新的進(jìn)程,它幾乎
    發(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ù)詳解

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

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

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

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

     在Linux中fork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進(jìn)程中創(chuàng)建一個子進(jìn)程,而原進(jìn)程稱為父進(jìn)程。
    發(fā)表于 12-01 13:41 ?7682次閱讀
    <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)建進(jìn)程

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

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

    Linux中可怕的fork炸彈介紹

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

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

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