国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

頭歌(Linux之進程管理一):第2關:進程創(chuàng)建操作-fork

這篇具有很好參考價值的文章主要介紹了頭歌(Linux之進程管理一):第2關:進程創(chuàng)建操作-fork。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

任務描述

在上一關我們學習如何獲取進程的pid信息,本關我們將介紹如何編程創(chuàng)建一個新的進程。

本關任務:學會使用C語言在Linux系統(tǒng)中使用fork系統(tǒng)調(diào)用創(chuàng)建一個新的進程。

相關知識

Linux系統(tǒng)中創(chuàng)建進程有很多函數(shù)可以使用,其中包括了系統(tǒng)調(diào)用也包括庫函數(shù)。本關將介紹一個最常見的系統(tǒng)調(diào)用函數(shù)來創(chuàng)建進程,這就是使用fork函數(shù)來創(chuàng)建一個新進程。

當用戶調(diào)用fork函數(shù)時,系統(tǒng)將會創(chuàng)建一個與當前進程相同的新進程。通常將原始進程稱為父進程,而把新生成的進程稱為子進程。子進程是父進程的一個拷貝,子進程獲得同父進程相同的數(shù)據(jù),但是同父進程使用不同的數(shù)據(jù)段和堆棧段。

在早期的系統(tǒng)中,創(chuàng)建進程比較簡單。當調(diào)用fork時,內(nèi)核會把所有的內(nèi)部數(shù)據(jù)結構復制一份,復制進程的頁表項,然后把父進程的地址空間中的內(nèi)容也復制到子進程的地址空間中。但是從內(nèi)核角度來說,這種復制方式是非常耗時的。

因此,在現(xiàn)代的系統(tǒng)中采取了更多的優(yōu)化?,F(xiàn)代的Linux系統(tǒng)采用了寫時復制技術(Copy on Write),而不是一創(chuàng)建子進程就將所有的數(shù)據(jù)都復制一份。

Copy on Write(COW)的主要思路是:如果子進程/父進程只是讀取數(shù)據(jù),而不是對數(shù)據(jù)進行修改,那么復制所有的數(shù)據(jù)是不必要的。因此,子進程/父進程只要保存一個指向該數(shù)據(jù)的指針就可以了。當子進程/父進程要去修改數(shù)據(jù)時,那么再復制該部分數(shù)據(jù)即可。這樣也不會影響到子父進程的執(zhí)行。因此,在執(zhí)行fork時,子進程首先只復制一個頁表項,當子進程/父進程有寫操作時,才會對所有的數(shù)據(jù)塊進行復制操作。

頭歌(Linux之進程管理一):第2關:進程創(chuàng)建操作-fork

[COW思路]

Linux系統(tǒng)中可以使用man命令來查詢該函數(shù)的使用方法。具體的查詢命令為: man 2 函數(shù)名

使用fork函數(shù)創(chuàng)建進程

fork函數(shù)的具體的說明如下:

  • 需要的頭文件如下:

    1. #include <unistd.h>
  • 函數(shù)格式如下: pid_t fork(void);

  • 函數(shù)返回值說明: 調(diào)用成功,fork函數(shù)兩個值,分別是0和子進程ID號。當調(diào)用失敗時,返回-1,并設置錯誤編號errno。

注意:fork函數(shù)調(diào)用將執(zhí)行兩次返回,它將從父進程和子進程中分別返回。從父進程返回時的返回值為子進程的 PID,,而從子進程返回時的返回值為0,并且返回都將執(zhí)行fork之后的語句。

案例演示1: 編寫一個程序,使用fork函數(shù)創(chuàng)建一個新進程,并在子進程中打印出其進程ID和父進程ID,在父進程中返回進程ID。詳細代碼如下所示:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. int main()
  7. {
  8. pid_t pid;
  9. pid = fork();
  10. if(pid == -1)
  11. {
  12. //創(chuàng)建進程失敗
  13. printf("創(chuàng)建進程失敗(%s)!\n", strerror(errno));
  14. return -1;
  15. }
  16. else if(pid == 0)
  17. {
  18. //子進程
  19. printf("當前進程為子進程:pid(%d),ppid(%d)\n", getpid(), getppid());
  20. }
  21. else
  22. {
  23. //父進程
  24. printf("當前進程為父進程:pid(%d),ppid(%d)\n", getpid(), getppid());
  25. }
  26. //子進程和父進程分別會執(zhí)行的內(nèi)容
  27. return 0;
  28. }

頭歌(Linux之進程管理一):第2關:進程創(chuàng)建操作-fork

將以上代碼保存為forkProcess.c文件,編譯執(zhí)行??梢钥吹矫看螆?zhí)行forkProcess時,子進程和父進程都不是固定的執(zhí)行順序,因此由fork函數(shù)創(chuàng)建的子進程執(zhí)行順序是由操作系統(tǒng)調(diào)度器來選擇執(zhí)行的。因此,子進程和父進行在執(zhí)行的時候順序不固定。

編程要求

本關的編程任務是補全右側代碼片段中BeginEnd中間的代碼,具體要求如下:

  • 補全createProcess函數(shù),使用fork函數(shù)創(chuàng)建進程,并在子進程中輸出"Children"字符串,在父進程中輸出"Parent"字符串。(注意:不要在createProcess函數(shù)中使用exit函數(shù)或者return來退出程序)。

測試說明

本關的測試需要用戶在右側代碼頁中補全代碼,然后點擊評測按鈕,平臺會自動驗證用戶是否按照要求去檢測結果。

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/************************
 * 提示: 不要在子進程或父進程中使用exit函數(shù)或者return來退出程序
*************************/
void createProcess()
{
	/********** BEGIN **********/
	pid_t pid=fork();

    if(pid==-1)
    {
        printf("創(chuàng)建進程失敗(%s)!\n", strerror(errno));
    }
	else if(!pid)
    {
        printf("Children",getpid(),getppid());
    }
    else
    {
        printf("Parent",getpid(),getppid());
    }
	/********** END **********/
}

?第三關鏈接--頭歌(Linux之進程管理一):第3關:進程創(chuàng)建操作-vfork_小妞無語的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-464168.html

到了這里,關于頭歌(Linux之進程管理一):第2關:進程創(chuàng)建操作-fork的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Linux:創(chuàng)建進程 -- fork,到底是什么?

    Linux:創(chuàng)建進程 -- fork,到底是什么?

    ?相信大家在初學進程時,對fork函數(shù)創(chuàng)建進程一定會有很多的困惑,比如: 1.fork做了什么事情??? 2.為什么fork函數(shù)會有兩個返回值? 3.為什么fork的兩個返回值,會給父進程諒回子進程pid,給子進程返回0? 4.fork之后:父子進程誰先運行?? 5.如何理解同一個變量,會有不同的值?? 本

    2024年02月05日
    瀏覽(23)
  • 【Linux操作系統(tǒng)】探秘Linux奧秘:進程與任務管理的解密與實戰(zhàn)

    【Linux操作系統(tǒng)】探秘Linux奧秘:進程與任務管理的解密與實戰(zhàn)

    ??個人主頁: Sarapines Programmer ???系列專欄: 《操作系統(tǒng)實驗室》 ??詩賦清音:柳垂輕絮拂人衣,心隨風舞夢飛。 山川湖海皆可涉,勇者征途逐星輝。 目錄 ??1 初識Linux OS ??2?進程與任務管理的解密與實戰(zhàn) ??1. 實驗目的 ??2. 實驗準備 ??3. 實驗內(nèi)容 ??4. 實驗心得 ??

    2024年02月03日
    瀏覽(19)
  • 頭歌操作系統(tǒng) 課堂練習3.2:進程的創(chuàng)建

    頭歌操作系統(tǒng) 課堂練習3.2:進程的創(chuàng)建

    本實訓需要設置內(nèi)核版本 1 為調(diào)試分析的對象,用 gdb 調(diào)試內(nèi)核,內(nèi)核版本 1 的壓縮文件存放在 /data/workspace/myshixun/exp1 中。 環(huán)境配置詳情請移步前幾關~頭歌操作系統(tǒng) 課后作業(yè)3.1:進程的描述與狀態(tài) 編程要求 根據(jù)相關知識,回答問題: (將答案填寫在 /data/workspace/myshixun/第

    2024年02月04日
    瀏覽(66)
  • 頭歌操作系統(tǒng)-課堂練習3.2:進程的創(chuàng)建

    頭歌操作系統(tǒng)-課堂練習3.2:進程的創(chuàng)建

    第1關:進程創(chuàng)建前后TR寄存器值的分析 編程要求 根據(jù)相關知識,回答問題: (將答案填寫在 /data/workspace/myshixun/第一關.txt 中) 0 號進程的 fork 系統(tǒng)調(diào)用(main.c:147)中的陷入指令的地址是多少? 0 號進程執(zhí)行 fork 系統(tǒng)調(diào)用之前,TR 寄存器的值為多少? 0 號進程剛執(zhí)行完 for

    2023年04月26日
    瀏覽(167)
  • 【Linux操作系統(tǒng)】深入探索Linux進程:創(chuàng)建、共享與管理

    【Linux操作系統(tǒng)】深入探索Linux進程:創(chuàng)建、共享與管理

    進程的創(chuàng)建是Linux系統(tǒng)編程中的重要概念之一。在本節(jié)中,我們將介紹進程的創(chuàng)建、獲取進程ID和父進程ID、進程共享、exec函數(shù)族、wait和waitpid等相關內(nèi)容。 在Linux系統(tǒng)中,進程的創(chuàng)建使用 fork() 系統(tǒng)調(diào)用。 fork() 系統(tǒng)調(diào)用會創(chuàng)建一個與當前進程相同的子進程,子進程會復制父進

    2024年02月12日
    瀏覽(35)
  • 頭歌(Linux之進程管理一):第4關:進程終止

    頭歌(Linux之進程管理一):第4關:進程終止

    任務描述 在上一關我們學習使用 vfork 函數(shù)創(chuàng)建新進程,并且使用 exit 來結束子進程,本關我們將介紹 Linux 系統(tǒng)中結束進程的其它方法。 本關任務:學習終止進程的常見方法。 相關知識 在上一關以及看到,開發(fā)人員使用 vfork 創(chuàng)建出來的子進程可以用 exit 函數(shù)來結束。在 L

    2024年02月08日
    瀏覽(129)
  • 《Linux操作系統(tǒng)編程》 第六章 Linux中的進程監(jiān)控: fork函數(shù)的使用,以及父子進程間的關系,掌握exec系列函數(shù)

    《Linux操作系統(tǒng)編程》 第六章 Linux中的進程監(jiān)控: fork函數(shù)的使用,以及父子進程間的關系,掌握exec系列函數(shù)

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學會IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月11日
    瀏覽(29)
  • 使用fork函數(shù)創(chuàng)建一個進程

    使用fork函數(shù)創(chuàng)建一個進程

    pid_t fork(void) fork函數(shù)調(diào)用成功,返回兩次 (1)返回值為0,代表當前進程是子進程 (2)返回值為非負數(shù),代表當前進程是父進程 (3)調(diào)用失敗,則返回-1 代碼如下:

    2024年02月04日
    瀏覽(29)
  • Fork() 函數(shù):“父” 與 “子” 進程的交互(進程的創(chuàng)建)

    Fork() 函數(shù):“父” 與 “子” 進程的交互(進程的創(chuàng)建)

    前面我們講了C語言的基礎知識,也了解了一些數(shù)據(jù)結構,并且講了有關C++的一些知識,也學習了一些Linux的基本操作,也了解并學習了有關Linux開發(fā)工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代碼也相信大家都掌握的不錯,上一篇文章我們了解了關于進程的基本概念,今

    2024年02月08日
    瀏覽(29)
  • linux 管理進程和計劃任務

    linux 管理進程和計劃任務

    目錄 一、進程原理 二、進程工作過程 三、進程類型 四、管理進程 五、前后臺調(diào)度 六、定時任務 七、管理定時任務 ? ? ? ? ? ? ? ? 一、進程原理 進程:指正在運行的程序稱之為進程 程序:指的是沒有運行的代碼 線程:真正的執(zhí)行者,是復制了一部分進程的代碼,可以

    2024年02月03日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包