Linux程序 2 殭屍程序與檔案共享

2021-08-22 19:42:30 字數 2466 閱讀 5693

孤兒程序:

如果父程序先退出,子程序還沒退出那麼子程序成為孤兒程序,此時子程序的父程序將變為init程序(託孤給了init程序)。(注:任何乙個程序都必須有父程序)

//生成孤兒程序

int main(int argc, char *argv)

exit(0);

}

殭屍程序:如果子程序先退出,父程序還沒退出,那麼子程序必須等到父程序捕獲到了子程序的退出狀態才真正結束,否則這個時候子程序就成為殭屍程序。

//生成殭屍程序

int main(int argc, char *argv)

exit(0);

}

查詢父子程序狀態

ps -le | grep main

避免殭屍程序

signal(sigchld, sig_ign);

通過signal(sigchld, sig_ign)通知核心對子程序的結束不關心,由核心**。如果不想讓父程序掛起,可以在父程序中加入一條語句:signal(sigchld,sig_ign);表示父程序忽略sigchld訊號,該訊號是子程序退出的時候向父程序傳送的。

//示例: 避免殭屍程序

int main(int argc, char *argv)

exit(0);

}

父程序的所有檔案描述符都被複製到子程序中, 就好像呼叫了dup函式, 父程序和子程序每個相同的開啟檔案描述符共享乙個檔案表項(因此, 父子程序共享同乙個檔案偏移量);

//根據上圖: 理解下面這段程式和下圖的演示

int main(int argc, char *argv)

else if (pid == 0)

}

在unix/linux中的fork還沒實現copy on write(寫時複製)技術之前。unix設計者很關心fork之後立刻執行exec所造成的位址空間浪費,所以引入了vfork系統呼叫。其中,vfork子程序與父程序共享資料段,並不真正複製父程序記憶體,因此在vfork之後執行exec系列函式,並不會導致位址空間浪費以及無用的空間複製時間.而且,即使fork實現了copy on write,效率也沒有vfork高.

但是,vfork有個限制,子程序必須立刻執行_exit或者exec系列函式。因此我們不推薦使用vfork,因為幾乎每乙個vfork的實現,都或多或少存在一定的問題。

區別:1、fork()用於建立乙個新程序。由fork()建立的子程序是父程序的副本。即子程序獲取父程序資料段、堆和棧的副本。父子程序之間不共享這些儲存空間的部分。而vfork()建立的程序並不將父程序的位址空間完全複製到子程序中,因為子程序會立即呼叫exec (或exit)於是也就不會存放該位址空間。相反,在子程序呼叫exec或_exit之前,它在父程序的空間進行。

2、vfork()與fork()另乙個區別就是:vfork保證子程序先執行,在呼叫exec或_exit之前與父程序資料是共享的,在它呼叫exec或_exit之後父程序才可能被排程執行。(如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。)

相同:1、兩者被呼叫一次,但是返回兩次。兩次返回的唯一區別是子程序的返回值是0,而父程序的返回值則是新子程序的程序id。

//示例1:vfork出錯情況

//在linux 2.6核心上會持續執行,不會退出

//而在linux 3.13核心上, 則會引發core dump

int main()

else if (pid > 0)

else if (pid == 0)

return 0;

}

//示例2: 父程序/子程序修改全域性資料的情況

int main()

else if (pid == 0)

return 0;

}

//示例3:用vfork執行當前目錄下的hello程式

int main()

else if (pid > 0)

else if (pid == 0)

return 0;

}

//測試4,用vfork執行系統命令

int main()

else if (pid > 0)

else if (pid == 0)

;int res = execve("/bin/ls",args,null);

if (res == -1)

_exit(0);

}return 0;

}

Linux 殭屍程序與孤兒程序

之前的部落格有講過儲存程序資訊的乙個重要的資料結構,task struct結構體,其中,state表示程序可能出現的狀態。如下 static const char const task state array 我們對個別狀態進行解釋如下 s sleeping 淺度睡眠,也是不可中斷睡眠。d disk...

Linux 殭屍程序與孤兒程序

產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍程序,在第...

Linux 殭屍程序與孤兒程序

殭屍程序 產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍...