那曲檬骨新材料有限公司

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

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

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

fork()函數(shù)詳解

嵌入式加油站 ? 來(lái)源:嵌入式加油站 ? 2023-08-15 09:41 ? 次閱讀

1.fork()簡(jiǎn)介

函數(shù)原型:

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

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

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

用于創(chuàng)建一個(gè)進(jìn)程,所創(chuàng)建的進(jìn)程復(fù)制父進(jìn)程的代碼段/數(shù)據(jù)段/BSS段/堆/棧等所有用戶空間信息;在內(nèi)核中操作系統(tǒng)重新為其申請(qǐng)了一個(gè)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ì)說(shuō)明及用法:

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

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

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

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

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

舉個(gè)例子來(lái)解釋fpid的值為什么在父子進(jìn)程中不同:“相當(dāng)于鏈表,進(jìn)程形成了鏈表,父進(jìn)程的fpid(p 意味point)指向子進(jìn)程的進(jìn)程id, 因?yàn)樽舆M(jìn)程沒(méi)有子進(jìn)程,所以其fpid為0.

3, fork()例程

看到這里大家對(duì)fork()有個(gè)大致了解了,讓我們來(lái)看個(gè)例題:

#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)生兩個(gè)pid(進(jìn)程)





審核編輯:劉清

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

    關(guān)注

    4326

    文章

    23161

    瀏覽量

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

    關(guān)注

    4

    文章

    596

    瀏覽量

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

    關(guān)注

    10

    文章

    460

    瀏覽量

    40281
  • Linux驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    10015
  • Fork
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3334

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

    一個(gè)進(jìn)程,包括代碼、數(shù)據(jù)和分配給進(jìn)程的資源。fork()函數(shù)通過(guò)系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來(lái)進(jìn)程幾乎完全相同的進(jìn)程,也就是兩個(gè)進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個(gè)進(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)過(guò)程,下面我們來(lái)看看內(nèi)核的 do_fork() 函數(shù)是如何創(chuàng)建一個(gè)新的進(jìn)程的。
    發(fā)表于 08-06 08:40

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

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

    最常見(jiàn)的fork用法是什么

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

    PICC庫(kù)函數(shù)詳解

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

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

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

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

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

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

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

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

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

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

     在Linux中fork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進(jìn)程中創(chuàng)建一個(gè)子進(jìn)程,而原進(jìn)程稱為父進(jìn)程。
    發(fā)表于 12-01 13:41 ?7967次閱讀
    <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 ?3113次閱讀
    Linux中可怕的<b class='flag-5'>fork</b>炸彈介紹

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

    STM32庫(kù)函數(shù)SystemInit()詳解
    的頭像 發(fā)表于 09-18 15:45 ?4259次閱讀
    STM32庫(kù)<b class='flag-5'>函數(shù)</b>SystemInit()<b class='flag-5'>詳解</b>
    金阳县| 骰子百家乐官网的玩法技巧和规则 | 娱乐百家乐官网的玩法技巧和规则 | 百家乐网页游戏| 百家乐官网在线直播| 百家乐官网微笑打| 新太阳城娱乐城| 太阳城百家乐官网手机投注| 百家乐路珠价格| 龙胜| 百家乐游戏试玩免费| 一二博| 百家乐平台开发| 云鼎娱乐城信誉| 百家乐官网和怎么算输赢| 大发888xp缺少 casino| 百家乐官网娱乐网真人娱乐网| 乐九百家乐现金网| 易胜博棋牌| 免费百家乐官网过滤| 大发888官方hgx2dafa888gwd| 澳门百家乐官网现场真人版| 百家乐小九梭哈| 永利高百家乐官网怎样开户| 百家乐api| 湖北省| 高档百家乐桌子| 百家乐官网在线手机玩| 百家乐赢多少该止赢| 百家乐官网园小区户型图| 新澳博百家乐的玩法技巧和规则| 真钱棋牌| 百家乐赌法| 百家乐官网游戏开发技术| 百家乐群必胜打朽法| 如何玩百家乐官网赚钱| 大发888体育投注| 百家乐官网追号| 赌场风云2| 木棉百家乐网络| 电脑打百家乐官网怎么赢|