210120 階段三 fork與阻塞函式

2021-10-16 21:29:50 字數 1558 閱讀 3353

1.1殭屍狀態

1.2孤兒

1.3如何避免殭屍程序

2 execlp

守護程序

二、上課沒有聽懂或者沒有理解的地方

三、當天學習的收穫

fork函式產生兩個程序,乙個是主程序,也就是父程序,另乙個是子程序。有兩個返回值,乙個返回值大於0,表示父程序,值為子程序的pid。乙個返回值等於0,表示子程序。

fork以後,子程序對父程序 rw段(已初始化) bss段(未初始化)的資料遵循寫時拷貝,有改動時才執行拷貝,而ro段的資料是共用的

fork前open的檔案,fork後的子程序後父程序都有相同的檔案描述符,但fork後open的檔案只有執行open的程序才有對應的檔案描述符。我的理解是檔案描述符可以繼承但不是共享的。

乙個子程序結束執行時,父程序還存在

子程序進入殭屍狀態,因為程序結束的返回碼還需要給父程序 exit(0)

子程序不再活躍(不執行邏輯),但是資源無法釋放(cpu/記憶體/資料)

以上總結說明 程式操作的時候不希望出現 殭屍狀態的情況。

父程序先於子程序結束

父程序沒了pid消失,父程序的所有子代程序都屬於孤兒程序

父程序吧子程序託孤給系統管理

以上總結說明 程式操作的時候不希望出現。

pid_t wait(int *status);

wait函式用於使父程序阻塞,只能讓父程序等待子程序,不能使子程序等待父程序。

wait的返回值,如果等待成功 返回等待的pid號,出錯則返回-1。

status引數 用來儲存被收集程序退出時的一些狀態,它是乙個指向int型別的指標。但如果我們對這個子程序是如何死掉的毫不在意,只想把這個殭屍程序消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個引數為null,就象下面這樣:pid = wait(null);

wait函式特點

如果有多個子程序在執行,那麼wait函式只會等待先結束的子程序

pid_t waitpid(pid_t pid, int * status, int options) ; 等待某個指定的子程序。等待程序id為pid的程序

在子程序裡呼叫另外乙個程式

execl系列函式的作用就是可以在你建立的子程序中呼叫其他人寫好的可執行程式

execlp是替換程序映像 相關函式只要呼叫,後面的**都不會執行 +p會匯入系統的環境變數

execlp(「ls」, 「ls -l」, null);

execlp(「ps」,「ps」,"-ax",0);

概念:程式一旦啟動就會轉入後台,不會因為關閉終端而結束程序

void

create_deamons()

//再建立乙個子程序的時候,這個子程序不是會話組組長他就沒有權力建立新的程序,真正脫離了終端執行

//這裡面的**才是真正的守護程序**

}_exit(0

);}else

if(pid >0)

}for(int i =

0;i<=

2;i+)

//關閉鍵盤 顯示器 錯誤輸出(並不是一定 一般規則如此)

避免殭屍程序

兩階段與三階段提交協議

首先了解一下為什麼要使用多階段提交協議這個東西。在分布式系統中,我們會存在乙個方法對多個庫進行插入或更新。但是每個節點只能知曉自己的操作是成功或失敗,卻無法知道其他節點的成功和失敗。這樣的話就會導致資料的不一致性。當乙個事務跨越了多個節點時,為了保持資料的一致性,所以就引進了兩階段提交協議這個東西。...

人生三階段

本文摘於 感謝博主 逍遙文 的分享!一張圖道盡 人生三階段 年少時 成年時年老時 現在正值成年期的我們,屬於自己的時間看起來是最少的,這一切的代價就是以時間去換取金錢,然後就容易錯過許多事情。我們沒有 富爸富媽 無法逃離這個宿命,那麼既然要工作,就選自己喜歡且擅長的工作吧!因為做起來輕鬆愉快,儘管偶...

三階段提交

由於二階段提交存在很多的問題,我們對其做了一定的改進,也就是三階段提交,過程圖如下 主要有2個優化點 1 引入超時機制。同時在協調者和參與者中都引入超時機制。2 在第一階段和第二階段中插入乙個準備階段。保證了在最後提交階段之前各參與節點的狀態是一致的。協調者向參與者傳送commit請求,參與者如果可...