Linux 程序的控制

2021-09-22 16:42:16 字數 3059 閱讀 1794

1、fork函式

在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。

程序呼叫fork,當控制轉移到核心中的fork**後,核心做:

我們來看一段程式具體了解一下fork()

程式執行結果

2、寫時拷貝

fork常規用法

fork呼叫失敗的原因1、程序退出的場景

2、程序常見退出方法

正常終止(可以通過echo $? 檢視最近程序退出時的退出碼):

3、exit函式與_exit函式的區別

exit最後也會呼叫_exit, _exit之前,還做了其他工作:

執行使用者通過 atexit或on_exit定義的清理函式。

關閉所有開啟的流,所有的快取資料均被寫入

呼叫_exit

4、**例項

_exit測試:

exit測試:

5、return退出程序等待的必要性

我們在之前的部落格程序狀態及優先順序提到我們的程序有可能會出現一種狀態叫殭屍程序(殭屍程序是子程序退出,父程序不管就會造成殭屍程序)

殭屍程序會占用系統記憶體,如果不進行**的話,會造成記憶體洩漏,程序一旦變成殭屍程序則會刀槍不入,因為殭屍程序已經是乙個已經死掉的程序了,沒有人能殺掉乙個死的程序就想沒人能殺掉乙個死掉的人一樣。

另外父程序也需要知道自己交給子程序的任務子程序完成的如何了,或是子程序已經完成了任務,父程序也應該知道結果是否正確。

因此父程序就需要通過程序等待的方式,等待子程序,**子程序的資源,獲取子程序的退出狀態

程序等待的方法

#include #include pid_t wait(int* status) //status為輸出型引數

返回值:

成功返回被等待程序的pid,失敗返回-1

引數: 輸出型引數,獲取子程序退出狀態,不關心則可以設定成為null

舉個栗子看看wait的用法

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

當正常返回的時候waitpid返**集到的子程序的程序id;

如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;

如果呼叫**錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;

引數: pid:

pid=-1,等待任乙個子程序。與wait等效。

pid>0.等待其程序id與pid相等的子程序。

status:(兩個巨集,可以用位運算代替巨集,功能相似)

wifexited(status): 若為正常終止子程序返回的狀態,則為真。(檢視程序是否是正常退出(其實是檢視程序終止訊號))

wexitstatus(status): 若wifexited非零,提取子程序退出碼。(檢視程序的退出碼)

options:

wnohang: 若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。若正常結束,則返回該子程序的id。

我們發現waitpid函式也有乙個status引數,那麼不如我們先來聊一聊這個引數的作用,首先你需要明確這是乙個輸出型引數,什麼是輸出型引數?就是你給他傳了乙個整型的位址,他會幫你賦值你想要的量,舉個簡單的栗子,看如下**:

void func(int* p)

int main()

從上述**我們可以知道其實status其實和p是一樣的作用,所以它相當是乙個位址,這個位址儲存的是子程序退出之後的相關資訊,下面我們來具體看一下是哪些資訊

檢視程序退出狀態的方式

阻塞式等待

#include #include #include #include #include int main()

else if (pid == 0)

else

else

} return 0;

}

非阻塞等待
#include #include #include #include int main()

else if (pid == 0)

else

sleep(1);

} while (ret == 0);

if (wifexited(status) && ret == pid)

else

} return 0;

}

程序的控制 Linux

編寫程式 建立乙個子程序,父程序列印10句 parent process!子程序列印10句 child process 要求用程序控制的方法,按順序先輸出子程序的10句話,再輸出父程序的10句話。include include include include void main 執行結果 說明 wa...

Linux的程序控制

1 有沒有命令能讓程序suspend and resume 參考 http zhidao.baidu.com question 57671342 kill stop 1234 將該程序暫停。如果要讓它恢復到後台,用kill cont 1234 很多在前台執行的程式這樣是不行的 如果要恢復到前台,請在...

linux 程序控制

什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...