關於fork一些有意思的問題

2021-08-04 14:39:46 字數 1467 閱讀 5338

最近學了fork,討論了幾個有意思的問題,對fork理解更深了一些,記錄一下

#include

#include

#include

int a=10;

int main()

printf("%d

%d",a,b);

}

當我們用return ,他會告訴我們段錯區。如果是exit就會正常輸出,為什麼呢?

我們知道vfork之後,子程序完全執行在父程序的位址空間上,子程序對該位址空間中的任意資料的修改同樣為父程序所見。所以子程序對b++後父程序的b也就是21了。

但為什麼用exit和return會不同呢?這就是return和exit的區別了。

return是函式級別的返回,return會先釋放區域性變數並彈棧,再回到上級函式。所以當返回回父程序時,父程序訪問變數時發現他們共用的堆疊區沒了,被坑了,所以爆出段錯誤。而exit是直接退出不會釋放堆疊區。

推薦一篇部落格,講的很詳細:

#include< stdio.h>

#include< unistd.h>

#include< sys/types.h>

int main()

}

答案會是多少呢?我們來看下面的圖:

由圖我們可以看到,由於子繼承了父的所有資料,所以第一次fork後在父和子中i都會變成2,在之後就會變成3,所以不會無線迴圈下去;

接著就是圖中看到是會輸出6次;但是如果你真的跑了一遍的話就會發現是8個;

因為子也繼承了父的輸出快取,所以子2,和孫1會繼承來於各自的父親的一次『-』,所以會輸出8次;如果我們在輸出『-』之後在加乙個『\n』(會重新整理快取區)就會發現是六個;

#include

#include

#include

#include

int main()

還是我們來上一張圖:

由圖分析我們可以看到有四種輸出結果,而且我們知道父子程序號是連號,所以如果給我們父程序的輸出結果,我們就可以推出其他三個輸出結果。

有兩點我們要注意,程序不一定誰先誰後:

1,四種情況輸出不一定誰先誰後;

2,子2不一定比孫1出生早,所以父程序輸出的兩個程序號不一定是連號,有可能是差乙個,而差的那乙個號一定是孫1的程序號,一定在子1那裡輸出;

一些有意思的東西

近日,在敲 的時候,筆者發現了一些有意思的東西。在我們用迴圈的時候,常常因為一些條件,要提前結束迴圈,而在c語言中,可以打破迴圈的就是break和continue了 1.看這個 它只輸出了兩個6,由此我們可以看出break是打破整個迴圈 2.再看關於continue 可以看出,它輸出了9個6,因此c...

一些有意思的話題

1.時空切換。各種穿越劇了,大話西遊 尋秦記 2.夢境切換 莊周曉夢迷蝴蝶,盜夢空間 3.靈魂切換 各種鬼神故事中靈魂互換,靈魂附體的故事。4.意念對白 俞伯牙和鍾子期,英雄 中無名和長空的意念搏鬥,一念桃花源 中蘇東坡和陶淵明的隔空對話。5.想象切換 英雄 中,無名和秦始皇各自的想象演繹。各種影視...

關於樹狀陣列一些有意思的東西

嘛 最近剛剛學會樹狀陣列,寫個blog記錄一下心得。樹狀陣列呢,核心是乙個叫lowbit的東西,lowbit x x x x的最後一位1的大小。一 乙個經典問題 乙個初始值為0的k位計數器,要求支援n次 1操作。時間複雜度?經典解法 法i 考慮第i位的改變次數,可得o k 1 i 0n 2i o i...