程序退出以及記憶體釋放

2021-07-04 04:59:06 字數 1324 閱讀 8762

程序退出表示程序即將結束執行。

1.正常退出

2.異常退出

程序退出後都會將所有已開啟的檔案描述符關閉,釋放它所占用的記憶體和其他資源

各種退出方式之間的比較:

父子程序終止的先後順序回產生不同的結果,子程序退出前父程序先退出,則會產生孤兒程序,由init程序接管。當子程序先於父程序終止,而父程序又沒有呼叫wait函式等待子程序結束,子程序就回進入僵死狀態,子程序進入僵死狀態之後核心只儲存該程序的一些必要資訊以備父程序所需。若父程序呼叫了wait或waitpid函式,則父程序會等待子程序結束。

下面這個例子解釋了關於退出時的記憶體釋放與否與不同的退出方式之間的聯絡:

#include

#include

#include

#include

int globvar = 5;

int main(void)

printf("child globvar = %d, var = %d\n", globvar, var);

break;

case -1:

perror("parent process failed\n");

exit(0);

default:

i = 5;

while(i-- > 0)

printf("parent's globvar = %d, var = %d\n", globvar, var);

exit(0);}}

這段**本來是要測試vfork建立的子程序與父程序公用同一塊記憶體空間,也就是子程序對變數的改變對父程序是可見的。但最終的結果卻出乎意料:

當子程序退出之後,父程序本來應當接著子程序的var進行遞加的,但是最終的結果卻是子程序退出,父程序的var成為了隨機值,後來我在程式的最後新增了exit(0)之後程式的執行結果就變成了這樣:

變數的結果正常了,這是因為在之前case 0時子程序的退出在break之後並未做任何退出函式的呼叫於是預設是以return結束這個函式的,那麼return的退出是函式的退出,函式的退出是會清除在函式內部的區域性變數的。所以var值被釋放,變成了隨機值。當在最後新增exit(0)之後,exit並不會釋放棧記憶體,所以結果正常了。

使用者程序釋放記憶體

linux使用者程序是如何釋放記憶體的 linux程序使用記憶體的基本流程 見圖1從圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的 也就是glibc的動態記憶體分配策略上 堆的管理是由glibc進行的。所以我們呼叫free對ma...

C C 記憶體分配以及釋放

int ptr int malloc size countsize 隨機 int ptr int calloc int number,size itemsize 預設為0 用 ptr nullptr 或者用 ptr 0來判斷是否分配成功 重新分配已有的記憶體 realloc block,size t...

程序的退出方式以及殭屍程序和孤兒程序

1 正常退出 檢查wait和waitpid所返回的終止狀態的巨集巨集 說明wifexited status 若為正常終止子程序返回的狀態,則為真。對於這種情況可執行wexitstatus status 取子程序傳送給exit exit或 exit引數的低8位 wifsignaled status 若...