linux---談談vfork和fork的區別及exit與return

fork():創建子進程的函數,是大家比較熟悉的吧。pid_t id = fork();

這里的vfork();也是創建子進程的函數。現在我們來剖析一下它們吧。

第一例:

先看一個fork()的例子哦。吐舌頭吐舌頭


對于fork()而言,創建子進程成功后直接打印出父子進程執行的兩條語句。即:


這里要特別強調的是:父子進程的調度的順序是由調度器決定的。


再看看vfork()函數:


這里有一個重要的函數:exit(1);這也是vfork()中特別重要的一點,如果在子進程中不使用exit(1)會怎么樣呢?這意味著父進程永遠不會運行。如:


這里的父進程的pid在創建子進程前是多少現在還是多少。即子進程一直在運行。這就是因為沒有使用exit(1)的原因。

子進程如果調用了exit(1);說明子進程結束后調用父進程。(這里也說明vfork()的一大特點:先調用子進程,等子進程的exit(1)被調用后,再調用父進程)所以結果如下:



第二例:

看一看它們的地址空間哦:

vfork():


這里看一下他們的地址空間是如何分配的。看看運行的結果:


看的出來,他們的虛擬地址空間是一樣的,這一點和fork()函數是一樣的。重要的是,當子進程中將g_val的值改變了之后,父進程也隨之改變,這一點卻是和fork()不一樣的,進而引出vfork()函數的另一大特點:在子進程調用exit之前,它在父進程的空間中運行,也就是說會更改父進程的數據段、棧和堆。。

如:


運行結果:



fork()函數:它的虛擬地址是相同的,但是值卻不相同,它們所指的物理地址也是不同的。

據上所述,總結一下fork()與vfork()的區別吧~~~:>>

主要為兩點:

(1)執行次序:fork():對父子進程的調度室由調度器決定的;

? ? ? ?vfork():是先調用子進程,等子進程的exit(1)被調用后,再調用父進程;

(2)對數據段的影響:fork():父子進程不共享一段地址空間,修改子進程,父進程的內容并不會受影響。

? ? ? ? ? ??vfork():在子進程調用exit之前,它在父進程的空間中運行,也就是說會更改父進程的數據段、 ? ? ? ? ? ? ? ? ?棧和堆。。即共享代碼區和數據區,且地址和內容都是一樣的。


第三例:

這個例子是關于vfork()創建子進程,且子進程用return返回。


運行結果:


子進程返回時,運行結果是執行后程序一直不斷地重復運行,不斷創建子進程;

子進程return 1在一個函數中是正常的返回過程,它會使得程序返回到函數被調用處,回復之前的執行流程,又會輸出父子進程,所以不像exit一樣,直接終止進程。


就先說到這里啦,有什么建議還會做改進哦~~吐舌頭吐舌頭


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382869.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在MySQL數據庫建立多對多的數據表關系

轉載自 https://blog.51cto.com/13145200724/1370753

C語言模擬實現標準庫函數之qsort()

qsort 編譯器函數庫自帶的快速排序函數。 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 參數解釋: void*base-待排序數組首地址size_t num-數組中待排序元素數量size_t width-各元素的占用空間大小int(__cde…

django contrib 包簡介

轉自 https://www.cnblogs.com/tianboblog/p/6955297.html

linux之管道

管道(PIPE)是linux中一個重要的通信方式,在進程中,我們通過從一個進程中讀取到的數據轉到另一個進程中的寫數據中,這時就要有不同的進程之間共享同一份資源,就是所謂的進程間通信。由于進程的特點是資源獨占…

把student a am i 變成 i am a student(兩種方法)

文章目錄#student a am i 變成 i am a student##方法1&#xff1a;指針#include <stdlib.h> #include <stdio.h> #include <string.h>void fanw(char *l, char *r) {char* left l;char* right r;char temp;while (left < right){temp *left;*left *ri…

關掉占用 某端口的進程

sudo fuser -k 8000/tcp 這樣和端口8000相關的進程就都關了。

linux之多線程(1)

我們之前講了進程&#xff0c;今天我們重新認識另外一個概念---線程。我們首先會想到的是進程和線程有什么區別和聯系&#xff0c;對吧&#xff1f;進程是由程序執行起來&#xff0c;跑在操作系統的&#xff0c;是系統進行資源分配和調度的基本單位。進程具有資源獨占性&#x…

C語言typedef與#define的區別

typedef和#define define 沒有參加編譯&#xff0c;在預處理的時候就被替換掉了。 typedef參加編譯和鏈接。typedef是重命名&#xff0c;可以為枚舉結構體等等重新命名&#xff0c;提高代碼整潔。 一、typedef的用法 C語言中&#xff0c;typedef常用來定義一個標識符及關鍵…

django models模型 內部類 class Meta 簡介

class Meta: #這個屬性是定義當前的模型類是不是一個抽象類。所謂抽象類是不會相應數據庫表的。一般我們用它來歸納一些公共屬性字段&#xff0c;然后繼承它的子類能夠繼承這些字段。abstractTrue #db_table是用于指定自己定義數據庫表名的db_table test#因為Django的管理方法…

阻斷血緣關系以及checkpoint文件清理

spark-sql讀寫同一張表&#xff0c;報錯Cannot overwrite a path that is also being read from 1. 增加checkpoint&#xff0c;設置檢查點阻斷血緣關系 sparkSession.sparkContext.setCheckpointDir("/tmp/spark/job/OrderOnlineSparkJob")val oldOneIdTagSql s&…

linux之睡眠函數(my_sleep)

我們在程序中&#xff0c;很多次用到sleep()函數&#xff0c;讓它睡眠幾秒后再執行該進程。今天呢&#xff0c;我要給大家實現一下sleep函數。 看看代碼哦&#xff1a; 運行結果&#xff1a; 結果中每隔三秒鐘&#xff0c;打印一條語句。實現了sleep(3)的功能。 關于sleep函數…

C語言 防止頭文件被多次引用

comm.h和comm.c是公共模塊。 test1.h和test1.c使用了公共模塊。 test2.h和test2.c使用了了公共模塊。 test.h和test.c使?用了了test1模塊和test2模塊。 這樣最終程序中就會出現兩份comm.h的內容。這樣就造成了了文件內容的重復。 1.方法1 文件開頭加上這一句就ok #prag…

python字符串切片操作

name abcdefghijk name[2:-1] cdefghijname[2:] cdefghijk # 第三個參數是步長 name[2:-1:2] cegi# 字符串反轉 name[::-1] name[-1::-1] kjihgfedcba kjihgfedcba

機器思維。一些讓我眼前一亮的算法。

用人腦相處了計算機處理數據的方式。而不是 人腦處理的方式—>用計算機的語言表達 人腦處理的方式—>計算機處理的方式—>用計算機的語言表達

python 之 __new__ 方法理解

python的new方法 使用場景不同效果也不一樣 一種是指定元類時候&#xff0c; metaclassMyType 類型 這種方式 在解釋器執行到 metaclassCrawlerProxyMetaclass 的時候&#xff0c; __new__方法就開始執行&#xff01; 這里的 __new__方法是用來創建類對象的 class CrawlerProx…

詳解強制類型轉換

今天談談類型轉換的問題吧&#xff0c;之前我們也遇到過類型轉換&#xff0c;比如c語言中這樣的賦值&#xff1a; 顯然&#xff0c;i和j是不同類型的變量&#xff0c;但是卻可以完成賦值&#xff0c;結果是這樣的&#xff1a; 其實它們是做了隱式的類型轉換&#xff0c;相當于&…

面試--輸入一堆隨機數(0-1000),這里面會有重復的數字,把他們去除掉。然后由大到小排列。

1.問題說明 11 10 20 40 32 67 40 20 89 300 400 15 10 15 20//只顯示1次 32 40//只顯示1次 67 89 300 400 正常的算法&#xff1a; 1.遍歷所有數組&#xff0c;去除掉重復的數字 2.使用XX排序法&#xff0c;進行數字的排序。 眼前一亮的機器算法 1.生成1-1000的數組&am…

c++之類型萃取

剛剛我們接觸過模板類&#xff0c;類似于這樣的&#xff1a; 在這個類中&#xff0c;我們如何知道它是什么類型的呢&#xff1f;這里&#xff0c;我們可以在類中加入一個內嵌類型&#xff0c;如&#xff1a; 這樣就可以知道它是用戶自定義的還是本身類型就擁有的&#xff0c;我…

django xadmin出現的問題

1.File “/home/yuanqi/.virtualenvs/djangodev1/lib/python3.5/site-packages/xadmin/sites.py”, line 9, in reload(sys) import importlib importlib.reload(sys)# sys.setdefaultencoding("utf-8")把相應文件改為上述這樣

一道面試題--兩個int(32位)整數m和n的二進制表達中,有多少個位(bit)不同

1.問題說明 十進制4 0100 十進制8 1000二進制不同的 0100 1000有兩位不同 正常的算法 1.兩個數字與1&#xff0c;拿出兩個數字的最后一位&#xff0c;比較是否相同&#xff0c;直到右移32次&#xff0c; for (int i 0; i < 32; i){if ((m & 1) ! (n & 1)){count…