Linux
為什麼“子”程序在其父程序之前完成?
這是給出的程式碼範例:
# include <stdio.h> # include <unistd.h> void main() { static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; int display(char *), i; for (i=0; i<10; ++i) display(mesg[i]); sleep(2); } int display(char *m) { char err_msg[25]; switch (fork()) { case 0: execlp("/bin/echo", "echo", m, (char *) NULL); sprintf (err_msg, "%s Exec failure", m); perror(err_msg); return(1); case -1: perror ("Fork failure"); return(2); default: return(0); } }
現在,我在執行這個程序之前的假設是父母會在他們的孩子之前完成。所以我的預期輸出是
0 1 2 3 4 5 6 7 8 9
但是,每次我執行程序時,我都會得到一個隨機的程序順序。我的問題是“為什麼?”。是因為處理器會在程序之間跳轉的“上下文切換”嗎?某些程序比其他程序獲得更多的“資源分配”嗎?父子程序的順序不是一成不變的,這就是我們有殭屍和孤兒程序的原因嗎?
一旦你 fork() 子程序就開始執行,實際上它們甚至沒有“啟動”,它們只是在 fork() 呼叫之後繼續在程式碼中,就像父程序一樣。只有 fork() 的返回值不同。父母和孩子可以按任意順序退出。所以是的,上下文切換將使所有程序隨機執行。
當子程序退出並且父程序沒有正確“獲取”子程序退出程式碼時,您將獲得殭屍程序。殭屍程序基本上只包含尚未檢索的退出程式碼,每次看到一個,都責怪父程序不小心。(殭屍是父級中的一個錯誤,除非父級是短暫的並且不需要照顧。)如果父級在子級之前退出,則子程序將重新設置為 PID 1,這將執行退出程式碼收穫。(它還將清除程序中的任何殭屍。)